Сокращение репозиториев до агрегированных корней

В настоящее время у меня есть репозиторий почти для каждой таблицы в базе данных, и я хотел бы в дальнейшем согласовать себя с DDD, уменьшив их до агрегированных корней.

Предположим, у меня есть следующие таблицы, User и Телефон . У каждого пользователя может быть один или несколько телефонов. Без понятия совокупного корня я мог бы сделать что-то вроде этого:

//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 ? Или это противоречит передовой практике.

82
задан e36M3 1 March 2011 в 17:29
поделиться