DDD: Получение совокупного поддерживает другие агрегаты

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

9
задан Ed. 14 February 2010 в 09:04
поделиться

3 ответа

Репозиторий не создается, а хранится. При использовании ddd вам может потребоваться познакомиться с базовыми шаблонами сохранения, такими как единица работы, карта идентичности, отложенная загрузка, сопоставитель объектных отношений, объект запроса, (динамический) прокси. (эти шаблоны не имеют ничего общего с ddd, но их очень полезно знать). Репозиторий - это просто фасад, чтобы скрыть реализацию упомянутых ранее шаблонов и абстрагироваться от доступа к данным в зависимости от предметной области. В настоящее время большинство людей не пишут свою инфраструктуру персистентности вручную, особенно при использовании ddd, возможно, вам захочется посмотреть на orm.

Фактическая ссылка с кодом, который преобразует записи базы данных в объект, будет в модуле данных. Между классами сопоставления будут ссылки в самих классах сопоставления или созданные чем-то вроде mapperfactory.

public interface IDataMapper<T>
{
   T Map(IDataReader reader);
}

Вам не нужно реализовывать этот код самостоятельно, просто используйте инструмент, который сделает это за вас, и попытайтесь понять, как работают части кода в инструменте (orm). Чистый ddd без ORM практически невозможен без хорошего набора инструментов, которые избавят вас от написания большого количества кода.

1
ответ дан 3 November 2019 в 08:20
поделиться

На мой взгляд, это зависит от обстоятельств - у меня такой же сценарий, и я справляюсь с этим через ORM, который я использую - nHibernate.

У меня есть сопоставления для всех моих объектов, некоторые из которых являются агрегированными корнями, а один из них имеет несколько других агрегированных корней в качестве переменных-членов. Репозиторий для этого составного корневого агрегата не требует ссылок на другие агрегированные корневые репозитории, потому что nHibernate знает, как получить все необходимые данные (через сопоставления).

HTH

AWC

0
ответ дан 3 November 2019 в 08:20
поделиться

@Paco: Вы ошибаетесь. Репозитории предназначены не только для хранения объектов. Если вы читали книгу Эрика Эвана по DDD, вы бы знали, что репозитории похожи на объектно-ориентированное представление данных в памяти. Вы можете использовать объект Repository так же, как вы используете Collection. Вы можете использовать индексатор для получения или установки объектов, вы можете использовать метод Add () для добавления нового объекта, вы можете использовать метод Remove () для удаления объекта и т. Д.

Репозиторий затем использует инфраструктуру для чтения / записывать данные из / в базу данных. Он может использовать DataMapper для упрощения извлечения данных из вашей реляционной базы данных и сопоставления с вашими объектами.

2
ответ дан 3 November 2019 в 08:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: