Question

Disons que je suis 2 entités - Foo et Bar. Foo est une racine globale et contient Bar. Pour autant que je comprends, il devrait ressembler à ceci:

public class Foo{
    private readonly Bar Bar;
}

Je veux fournir des fonctionnalités pour les utilisateurs de choisir Bars pour Foos à partir d'une liste définie (et le changer).

Si les dépôts sont censés être pour les racines globales que cela signifie qu'il n'y aura pas de dépôt pour l'entité Bar.

Cela conduit à un problème - Bar ne peut pas être créé / mis à jour indépendamment sans référence à Foo.

Est-ce que cela signifie que la barre est censé avoir un dépôt malgré qu'il n'a pas de sens sans Foo?

Était-ce utile?

La solution

Si vous voulez choisir parmi une liste de bars où ils ne sont pas associés à Foo, alors ce n'est pas une racine globale. Par exemple, vous ne pouvez pas obtenir la liste des OrderItems sans leur ordre, c'est donc unique racine globale (ordre), mais vous pouvez obtenir la liste des produits à attribuer à OrderItems, donc produit ne fait pas partie de la racine globale Ordre.

Notez que tout OrderItem fait partie de la racine globale de la commande, vous pouvez créer et mettre à jour indépendamment. Mais, vous ne pouvez pas l'obtenir sans référence à l'ordre. Même chose pour votre bar, même si elle faisait partie de Foo, vous pourriez obtenir chacun (Foo.Bars) et de travailler avec elle, ou faire Foo.AddBar (nouveau Bar ()). Mais si vous avez besoin pour obtenir la liste sans Foo, Bar ne fait pas partie de Foo ensemble. Il est une entité distincte.

Eh bien, voilà comment je vois DDD ici, mais je ne suis pas Eric Evans, bien sûr.

Autres conseils

Les raisons ayant des racines globales sont:

  1. Ils fournissent contrôlées et dirigées l'accès aux entités composites
  2. Ils peuvent appliquer des règles pour faire en sorte que l'agrégat entier est valide

Mon avis: Si vous devez sélectionner des objets Bar sans Foo, utilisez un BarRepository.

Mais ... Que faire si vous mettez à jour un Bar, et il enfreint une règle de validation pour sa Foo mère? Si cela pourrait se produire, vous devez accéder Bar via son Foo parent.

Si, cependant, vous devez avoir accès à un tas d'objets Bar (par exemple pour un traitement par lots ou un rapport), et vous connaissez que Foos ne sera pas se casser, aller de l'avant et d'y accéder via BarRepository.

Rappelez-vous que les racines globales peuvent être composées d'autres racines globales. Vous découvrirez peut-être que Bar est une racine globale elle-même, en vous donnant la justification d'une BarRepository:)

Êtes-vous sûr que Bar besoin d'être une entité? Avez-vous la nécessité de suivre et de le modifier dans le domaine? Si vous pouvez le regarder comme un objet de valeur, je suggère que vous rapportez à partir d'un service, puis « connecter » l'objet de valeur sélectionnée à l'entité Foo. Pour une liste par instants déroulante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top