32 votes

Ce qui appartient à la racine globale

C'est une pratique Domain Driven Design question:

Sur le plan conceptuel, je pense que je obtenir de l'Agrégation des racines jusqu'à ce que je vais à en définir un.

J'ai un Employé de l'entité, qui a surgi comme un Agrégat de la racine. Dans l'Entreprise, certains employés peuvent avoir de travail liées à des Violations enregistrées contre eux:

Employé-E-----*Les Violations

Depuis pas tous les Employés sont soumis à la présente, je pense que les Violations ne serait pas une partie de l'Employé Globale, correct?

Donc quand je veux travailler avec les Employés et de leurs violations, est-ce deux Référentiel par des interactions de certains Services?

Enfin, lorsque j'ajoute une Violation, c'est que la méthode de l'Employé de l'Entité? Merci pour l'aide!

25voto

jlembke Points 4551

Après avoir fait encore PLUS de recherche, je pense avoir la réponse à ma question.

Paul Stovell avait un peu modifié la réponse à une question similaire sur le DDD forum. Remplacer "Client" pour les "Employés", et "l'Ordre" pour "Violation" et vous obtenez l'idée.

Tout simplement parce que les références du Client Afin ne signifie pas nécessairement l'Ordre des chutes au sein de la Clientèle globale de la racine. Le client les adresses de la force, mais les commandes peuvent être indépendants (pour exemple, vous pouvez avoir un service qui les processus de tous les nouveaux ordres de n'importe qui le client est. Avoir à aller Client->Commandes n'a pas de sens dans ce scénario).

À partir d'un domaine point de vue, vous pouvez même s'interroger sur la validité de ces références (le Client a référence à une liste de Commandes). Combien de fois allez-vous réellement besoin de tous les ordres de le client? Dans certains systèmes, il fait sens, mais dans d'autres, un client peut faire beaucoup de commandes. Les Chances sont vous voulez des commandes pour un client entre une plage de dates, ou des commandes pour un client qui ne sont pas traités, ou encore les commandes qui n'ont pas été payés, et ainsi de suite. Le scénario dans lequel vous aurez besoin de toutes les d'entre eux peuvent être relativement rare. Cependant, il est beaucoup plus probable que lorsque vous traitez avec une Commande, vous souhaitez les informations du client. Donc, en code, Order.Customer.Name est utile, mais Customer.Orders[0].LineItem.SKU- probablement pas si utile. Bien sûr, qui dépend totalement de votre entreprise domaine.

En d'autres termes, la mise à Jour Client n'a rien à voir avec la mise à jour des Commandes. Et des ordres, ou des violations dans mon cas, pourrait concevable être traités indépendamment les Clients/Employés.

Si des Violations avaient lignes de détail, puis de la Violation et de la Violation de la ligne serait alors une partie du même ensemble, car la modification d'une violation de la ligne, risquerait de nuire à une Violation.

EDIT** La ride ici, dans mon Domaine, c'est que les Violations ont pas de comportement. Ils sont essentiellement des registres d'un événement qui s'est produit. Vous ne savez pas encore sur les implications qu'elle a fait.

21voto

Mosh Points 1436

Eric Evan affirme dans son livre, Domain-Driven Design: faire face à la Complexité dans le Cœur de Logiciels,

Un AGRÉGAT est un amas d'objets associés que nous traitons comme une unité aux fins de la modification des données.

Il y a 2 points importants:

  1. Ces objets doivent être traités comme une "unité".
  2. Dans le but de "changer".

Je crois que dans votre scénario, l'Employé et la Violation ne sont pas nécessairement une unité d'ensemble, alors que dans l'exemple de la Commande et OrderItem, ils font partie d'une seule unité.

Une autre chose qui est important lors de la modélisation de la agggregate limites est de savoir si vous avez des invariants de votre regroupement. Les Invariants sont les règles de gestion qui doit être valide au sein de la "totalité" de l'agrégat. Par exemple, que pour la Commande et OrderItem exemple, vous pourriez avoir un invariant qui indique le montant total de la commande doit être inférieure à un montant prédéfini. Dans ce cas, à tout moment vous souhaitez ajouter un OrderItem de l'Ordre, cette invariant devraient être appliquées pour s'assurer que votre Commande est valide. Cependant, dans votre problème, je ne vois pas d'invariants entre vos entités: l'Employé et de Violation.

Donc, réponse courte:

Je crois que l'Employé et à la Violation chaque appartiennent à séparer les 2 agrégats. Chacune de ces entités sont, eux aussi, leur agrégation des racines. Si vous avez besoin de 2 référentiels: EmployeeRepository et ViolationRepository.

Je crois aussi que vous devriez avoir une association unidirectionnelle de la Violation de l'Employé. De cette façon, chaque Violation objet sait à qui il appartient. Mais si vous voulez obtenir la liste de toutes les Violations pour un Employé en particulier, alors vous pouvez demander à la ViolationRepository:

var list = repository.FindAllViolationsByEmployee(someEmployee);

2voto

Yuriy Points 41

Vous dites que vous avez employé de l'entité et de violations et chaque infraction n'a pas de comportement lui-même. De ce que je peux lire ci-dessus, il me semble que vous avez deux agrégats racines:

  • Employé
  • EmployeeViolations (appeler EmployeeViolationCard ou EmployeeViolationRecords)

EmployeeViolations est identifié par le même ID d'employé et il détient une collection de violation des objets. Vous obtenez le comportement de l'employé et les violations séparés de cette façon et vous ne recevez pas de Violation de l'entité, sans problème.

Si la violation est une entité ou d'objet de valeur, vous devez décider en fonction de ses propriétés.

1voto

Timex Points 81

Je suis généralement d'accord avec Mosh sur celui-ci. Cependant, gardez à l'esprit la notion de transactions dans le point de vue des entreprises. J'ai donc fait prendre "aux fins de la modification des données" pour dire "dans le but de la transaction(s)".

Les référentiels sont des vues de modèle de domaine. Dans un environnement de domaine, ces "points de vue" vraiment de soutien ou de représenter une fonction commerciale ou de la capacité d'une transaction. Affaire au point, l'Employé peut avoir une ou plusieurs violations, et si oui, sont des aspects d'une transaction(s) en un point dans le temps. Examiner votre cas d'utilisation.

Scénario: "Un employé a commis un acte qui constitue une violation du milieu de travail." C'est un type d'événement d'entreprise (c'est à dire de la transaction, ou une partie d'un plus grand, peut-être distributed transaction) qui a eu lieu. La racine de domaine affecté objet peut être vu à partir de plus d'un point de vue, c'est pourquoi il est source de confusion. Mais la chose à retenir est que le comportement se rapporte à une transaction commerciale, puisque vous voulez que vos processus d'affaires afin de modéliser le monde réel aussi précises que possible. En termes de relations, tout comme dans une base de données relationnelle, votre conceptuel du modèle de domaine doit indiquer ce déjà (c'est à dire l'associativité), qui, souvent, peut être lu dans les deux sens:

Employé-e <----commet un -------commis par des ----> la Violation

Donc, pour ce cas d'utilisation, il serait juste de dire que c'est une opération de traitement des infractions, et que la racine ou la "première" de l'entité est une Violation. Qui, alors, serait votre racine d'agrégat vous de référence pour l'activité de l'entreprise ou de processus d'affaires. Mais ce n'est pas à dire que, pour une autre activité ou d'un processus, que vous ne pouvez pas avoir un Employé d'agrégation de la racine, comme le "nouvel employé processus". Si vous en prenez soin, il devrait y avoir aucun impact négatif du cycle des références, ou d'être en mesure de traverser votre modèle de domaine multiples façons. Je vais avertir, cependant, que les gouverneurs de ce qui devrait être pensé et géré par votre contrôleur de pièce de votre domaine d'affaires, ou que ce soit équivalent vous avez.

De côté: Réfléchir en termes de modèles (c'est à dire MVC), le référentiel est un point de vue, les objets du domaine sont le modèle, et donc on doit également employer une certaine forme de modèle de contrôleur. Généralement, le contrôleur déclare la mise en œuvre concrète et l'accès aux référentiels (les collections de l'ensemble des racines).

Dans l'accès aux données du monde...

À l'aide de LINQ-to-SQL, comme un exemple, le DataContext serait le contrôleur d'exposer un point de vue de la Clientèle et de l'Ordre des entités. La vue est un non-déclarative, cadre orientée type de Table (équivalent au Dépôt). Notez que la vue conserve une référence à son contrôleur de parent, et passe souvent par le contrôleur pour contrôler comment/quand la vue est matérialisé. Ainsi, le contrôleur est votre fournisseur, en prenant soin de la cartographie, de la traduction, de l'objet de l'hydratation, etc. Le modèle est ensuite vos données POCOs. Assez bien typique d'un modèle MVC.

À l'aide de N/Hibernate par exemple, le ISession serait le contrôleur d'exposer un point de vue de la Clientèle et des commandes entités par le biais de la session.Énumérable(string query) ou de la session.Get(object id) ou de la session.CreateCriteria(typeof(Client)).Liste()

Dans la logique métier du monde...

Customer { /*...*/ }

Employee { /*...*/ }

Repository<T> : IRepository<T>
              , IEnumerable<T>
              //, IQueryable<T>, IQueryProvider //optional

{ /**/ }

BusinessController {
 Repository<Customer>  Customers { get{ /*...*/ }} //aggregate root
 Repository<Order> Orders { get{ /*...*/ }} // aggregate root
}

En un mot, laissez vos processus d'affaires et les transactions d'être le guide, et laissez votre infrastructure d'entreprise évoluent naturellement comme des processus/activités sont mises en œuvre ou remaniée. Par ailleurs, préférez la composabilité par rapport à la traditionnelle boîte noire de la conception. Lorsque vous arrivez à axées sur le service ou le cloud computing, vous serez heureux vous avez fait. :)

0voto

Sanjay Points 1

Je me demandais quelle serait la conclusion?

Les «violations» deviennent une entité racine. Et les 'violations' seraient référencées par l'entité racine 'employé'. ie référentiel de violations <-> référentiel d'employés

Mais vous êtes persuadé de faire des violations une entité racine car il n’a aucun comportement.

Mais le «comportement» est-il un critère permettant de qualifier une entité racine? Je ne pense pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X