Ich komme aus einer Transaktionsskriptwelt und beginne gerade, mir DDD anzuschauen. Ich bin mir nicht sicher, wie ich ein DDD-Design mit Datenbankpersistenz richtig integrieren kann. Das habe ich:
Eine Serviceklasse namens OrganisationService, deren Schnittstelle Methoden zum Abrufen und Speichern von Instanzen von Organisationsdomänenobjekten enthält. Organisation ist eine aggregierte Wurzel und hat andere damit verbundene Daten: Mitglieder und Lizenzen. Der erste DBContext der EF6-Datenbank wird im OrganisationService verwendet, um OrganisationDB-Entitäten und die zugehörigen MemberDB- und LicenseDB-Entitäten abzurufen. Diese werden alle in ihre Domänenobjektklassenäquivalente umgewandelt, wenn sie vom OrganisationService abgerufen und in das Organisationsdomänenobjekt geladen werden. Dieses Objekt sieht so aus:
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
Ich verwende das Repository-Muster nicht im OrganisationService ... Ich verwende EF selbst als Repository, da EF6 das Repository anscheinend weitgehend überflüssig gemacht hat.
Zu diesem Zeitpunkt im Entwurf ist das Organisationsdomänenobjekt anämisch: Es sieht aus wie die EF POCO-Organisationsklasse. Die OrganisationService-Klasse ähnelt stark einem Repository!
Jetzt muss ich anfangen, Logik hinzuzufügen. Diese Logik umfasst das Verwalten von Lizenzen und Mitgliedern einer Organisation. In den Tagen des Transaktionsskripts würde ich dem OrganisationService Methoden zur Verarbeitung dieser Vorgänge hinzufügen und ein Repository aufrufen, um mit der Datenbank zu interagieren. Bei DDD sollte diese Logik jedoch im Organisationsdomänenobjekt selbst gekapselt sein ...
Hier bin ich mir nicht sicher, was ich tun soll: Ich muss diese Daten als Teil der Logik in der Datenbank speichern. Bedeutet dies, dass ich dazu DbContext im Organisationsdomänenobjekt verwenden sollte? Ist die Verwendung des Repositorys / EF innerhalb des Domänenobjekts eine schlechte Praxis? Wenn ja, wohin gehört diese Beharrlichkeit?
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);
}
}
Sollte ich stattdessen nur das Organisationsdomänenobjekt im Speicher mutieren und es dann zur Persistenz zurück an den OrganisationService senden? Dann muss ich nachverfolgen, was sich tatsächlich am Objekt geändert hat (was EF mit seinen eigenen POCOs macht! Ich habe das Gefühl, dass EF nicht nur ein Repository-Ersatz ist, sondern auch die Domänenschicht sein könnte!).
Jede Anleitung hier wird geschätzt.
quelle
Ich kenne EF6 nicht, aber andere ORM behandeln dies transparent, sodass Sie die Lizenzen nicht explizit zum Kontext hinzufügen müssen. Sie werden beim Speichern von Änderungen erkannt. Die Methode liegt also bei
und der Code darum herum
quelle