На даний момент у мене є сховище майже для кожної таблиці в базі даних, і я хотів би далі узгоджувати себе з DDD, зменшуючи їх до сукупних коренів.
Припустимо, що я маю наступні таблиці User
та Phone
. Кожен користувач може мати один або кілька телефонів. Без поняття агрегованого кореня я міг би зробити щось подібне:
//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]);
Поняття сукупних коренів легше зрозуміти на папері, ніж на практиці. У мене ніколи не буде телефонних номерів, які не належать Користувачеві, тож чи було б сенс позбутися PhoneRepository та включити в UserRepository методи, пов’язані з телефонами? Припускаючи, що відповідь так, я збираюся переписати попередній зразок коду.
Чи дозволено мені мати метод в UserRepository, який повертає телефонні номери? Або він завжди повинен повертати посилання Користувачеві, а потім проходити по взаємозв'язку через Користувача, щоб дістатися до телефонних номерів:
List<Phone> phones = UserRepository.GetPhoneNumbers(userId);
// Or
User user = UserRepository.GetUserWithPhoneNumbers(userId); //this method will join to Phone
Незалежно від того, яким способом я купую телефони, якщо припустити, що я змінив один із них, як я можу їх оновити? Я обмежено розумію, що об’єкти під коренем слід оновлювати через корінь, що спрямовує мене до вибору №1 нижче. Незважаючи на те, що це буде чудово працювати з Entity Framework, це здається надзвичайно неописовим, тому що, читаючи код, я не уявляю, що я насправді оновлюю, навіть незважаючи на те, що Entity Framework тримає вкладку на змінених об'єктах у графіку.
UserRepository.Update(user);
// Or
UserRepository.UpdatePhone(phone);
І, нарешті, якщо припустити , у мене є кілька довідкових таблиць, які на насправді не прив'язані ні до чого, наприклад CountryCodes
, ColorsCodes
, SomethingElseCodes
. Я можу використовувати їх для заповнення спадних меню або з будь-якої іншої причини. Це автономні сховища? Чи можна їх об'єднати в якусь логічну групування / сховище, наприклад CodesRepository
? Або це проти найкращих практик.