В настоящее время у меня есть репозиторий практически для каждой таблицы в базе данных, и я хотел бы еще больше согласовать себя с 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
? Или это противоречит передовой практике.