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 Useri 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.