Obecnie mam repozytorium dla prawie każdej tabeli w bazie danych i chciałbym dostosować się do DDD, redukując je tylko do zagregowanych korzeni.
Załóżmy, że mam następujące tabele User
i Phone
. Każdy użytkownik może mieć jeden lub więcej telefonów. Bez pojęcia zbiorczego korzenia mógłbym zrobić coś takiego:
//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]);
Pojęcie korzeni kruszywa jest łatwiejsze do zrozumienia na papierze niż w praktyce. Nigdy nie będę mieć numerów telefonów, które nie należą do użytkownika, więc czy sensowne byłoby pozbycie się PhoneRepository i włączenie metod związanych z telefonem do UserRepository? Zakładając, że odpowiedź brzmi tak, mam zamiar przepisać poprzedni przykład kodu.
Czy mogę mieć metodę w UserRepository, która zwraca numery telefonów? Czy też powinien zawsze zwracać odniesienie do Użytkownika, a następnie przechodzić przez relację za pośrednictwem Użytkownika, aby uzyskać dostęp do numerów telefonów:
List<Phone> phones = UserRepository.GetPhoneNumbers(userId);
// Or
User user = UserRepository.GetUserWithPhoneNumbers(userId); //this method will join to Phone
Niezależnie od tego, w jaki sposób kupię telefony, zakładając, że zmodyfikowałem jeden z nich, jak mam je zaktualizować? Moje ograniczone rozumienie jest takie, że obiekty znajdujące się pod korzeniem powinny być aktualizowane przez korzeń, co skierowałoby mnie do wyboru nr 1 poniżej. Chociaż będzie to działać doskonale z Entity Framework, wydaje się to wyjątkowo nieopisowe, ponieważ czytając kod, nie mam pojęcia, co właściwie aktualizuję, mimo że Entity Framework utrzymuje kartę zmienionych obiektów na wykresie.
UserRepository.Update(user);
// Or
UserRepository.UpdatePhone(phone);
Wreszcie, zakładając Mam kilka tabel przeglądowych, które nie są bardzo przywiązane do niczego, takie jak CountryCodes
, ColorsCodes
, SomethingElseCodes
. Mogę ich użyć do zapełnienia listy rozwijanej lub z jakiegokolwiek innego powodu. Czy są to samodzielne repozytoria? Czy można je połączyć w jakieś logiczne grupowanie / repozytorium, takie jak CodesRepository
? Czy jest to sprzeczne z najlepszymi praktykami.