Je viens d'un monde de scripts de transaction et je commence tout juste à jeter un œil à DDD. Je ne suis pas sûr de la bonne façon d'intégrer une conception DDD avec la persistance de la base de données. Voici ce que j'ai:
Classe de service appelée OrganisationService dont l'interface contient des méthodes de récupération et de sauvegarde des instances d'objets de domaine Organisation. L'organisation est une racine agrégée et possède d'autres données qui s'y rapportent: membres et licences. La première base de données EF6 DBContext est utilisée au sein de l'OrganisationService pour récupérer les entités OrganisationDB et les entités MemberDB et LicenseDB associées. Tous ces éléments sont transformés en leurs équivalents de classe d'objets de domaine lorsqu'ils sont récupérés par l'OrganisationService et chargés dans l'objet de domaine Organisation. Cet objet ressemble à ceci:
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
Je n'utilise pas le modèle de référentiel dans OrganisationService ... J'utilise EF lui-même comme référentiel car il semble qu'EF6 ait largement rendu le référentiel redondant maintenant.
À ce stade de la conception, l'objet domaine Organisation est anémique: il ressemble à la classe Organisation EF POCO. La classe OrganisationService ressemble beaucoup à un référentiel!
Maintenant, je dois commencer à ajouter de la logique. Cette logique inclut la gestion des licences et des membres d'une organisation. Maintenant, à l'époque des scripts de transaction, j'ajoutais des méthodes dans OrganisationService pour gérer ces opérations et appelais dans un référentiel pour interagir avec la base de données, mais avec DDD, je pense que cette logique devrait être encapsulée dans l'objet de domaine Organisation lui-même ...
C'est là que je ne suis pas sûr de ce que je dois faire: je devrai conserver ces données dans la base de données dans le cadre de la logique. Cela signifie-t-il que je devrais utiliser DbContext dans l'objet de domaine Organisation pour ce faire? L'utilisation du référentiel / EF dans l'objet de domaine est-elle une mauvaise pratique? Si oui, où cette persistance appartient-elle?
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
public void AddLicensesToOrganisation(IList<License> licensesToAdd)
{
// Do validation/other stuff/
// And now Save to the DB???
using(var context = new EFContext())
{
context.Licenses.Add(...
}
// Add to the Licenses collection in Memory
Licenses.AddRange(licensesToAdd);
}
}
Dois-je plutôt muter l'objet de domaine Organisation en mémoire, puis le repousser à OrganisationService pour qu'il persiste? Ensuite, je dois suivre ce qui a réellement changé sur l'objet (c'est ce qu'EF fait à ses propres POCO! Je ressens en quelque sorte que EF n'est pas seulement un remplacement de référentiel, mais pourrait également être la couche de domaine!)
Tout conseil ici est apprécié.
la source
Je ne connais pas EF6 mais d'autres ORM gèrent cela de manière transparente, vous n'aurez donc pas à ajouter explicitement les licences au contexte, il les détectera lors de l'enregistrement des modifications. Donc, la méthode se résumera à
et le code qui l'entoure
la source