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