В настоящее время у меня есть репозиторий практически для каждой таблицы в базе данных, и я хотел бы еще больше увязать себя с 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, это кажется крайне неописуемым, потому что, читая код, я не знаю, что Im действительно обновляет, хотя Entity Framework сохраняет вкладку с измененными объектами внутри графика.
UserRepository.Update(user);
// Or
UserRepository.UpdatePhone(phone);
Наконец, предполагая, что у меня есть несколько таблиц поиска, которые на самом деле не привязаны ни к чему, например CountryCodes
, ColorsCodes
, SomethingElseCodes
. Я мог бы использовать их для заполнения выпадающих списков или по любой другой причине. Являются ли эти автономные хранилища? Могут ли они быть объединены в какую-то логическую группировку/репозиторий, такую как CodesRepository
? Или это противоречит лучшим практикам.