Ich habe derzeit ein Repository für nahezu jede Tabelle in der Datenbank und möchte mich weiter an DDD ausrichten, indem ich sie auf aggregierte Roots reduziere.
Nehmen wir an, ich habe die folgenden Tabellen User
und Phone
. Jeder Benutzer kann ein oder mehrere Telefone haben. Ohne den Begriff der aggregierten Wurzel könnte ich so etwas tun:
//assuming I have the userId in session for example and I want to update a phone number
List<Phone> phones = PhoneRepository.GetPhoneNumberByUserId(userId);
phones[0].Number = “911”;
PhoneRepository.Update(phones[0]);
Das Konzept der aggregierten Wurzeln ist auf dem Papier leichter zu verstehen als in der Praxis. Ich werde niemals Telefonnummern haben, die keinem Benutzer gehören. Wäre es also sinnvoll, das PhoneRepository abzuschaffen und telefonbezogene Methoden in das UserRepository aufzunehmen? Angenommen, die Antwort lautet "Ja", dann schreibe ich das vorherige Codebeispiel neu.
Darf ich im UserRepository eine Methode haben, die Telefonnummern zurückgibt? Oder sollte es immer einen Verweis auf einen Benutzer zurückgeben und dann die Beziehung durch den Benutzer durchlaufen, um zu den Telefonnummern zu gelangen:
List<Phone> phones = UserRepository.GetPhoneNumbers(userId);
// Or
User user = UserRepository.GetUserWithPhoneNumbers(userId); //this method will join to Phone
Unabhängig davon, auf welche Weise ich die Telefone erwerbe, gehe ich davon aus, dass ich eines davon geändert habe. Mein begrenztes Verständnis ist, dass Objekte unter dem Stamm über den Stamm aktualisiert werden sollten, was mich zu Auswahl 1 unten führen würde. Obwohl dies mit Entity Framework sehr gut funktioniert, scheint dies äußerst unbeschreiblich zu sein, da ich beim Lesen des Codes keine Ahnung habe, was ich tatsächlich aktualisiere, obwohl Entity Framework geänderte Objekte im Diagramm im Auge behält.
UserRepository.Update(user);
// Or
UserRepository.UpdatePhone(phone);
Schließlich vorausgesetzt , ich mehrere Lookup - Tabellen haben, die nicht wirklich etwas gebunden sind, wie CountryCodes
, ColorsCodes
, SomethingElseCodes
. Ich könnte sie verwenden, um Dropdowns zu füllen oder aus irgendeinem anderen Grund. Sind das eigenständige Repositorys? Können sie zu einer logischen Gruppierung / einem logischen Repository kombiniert werden, z CodesRepository
. Oder ist das gegen Best Practices?