Почему репозитории используются только для агрегатов в доменно-ориентированном дизайне?

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

Однако мне интересно, почему репозитории всегда описываются как используемые специально для агрегатов. Разве не мотивировано использовать его для всех организаций?

(Если это просто вопрос того факта, что все простые сущности можно рассматривать как совокупные корни с нулевыми дочерними элементами, сообщите мне об этом, и вопрос можно скрыть.)


person Hannes Petri    schedule 27.09.2017    source источник
comment
Ваше последнее предложение правильное. Я прочитал книгу и не понял, что один объект может быть совокупным корнем без дочерних элементов и, следовательно, также является жизнеспособным кандидатом для хранения в репозитории.   -  person Adrian Thompson Phillips    schedule 27.09.2017
comment
Со всем согласен. У объекта есть собственный жизненный цикл и индивидуальность. Следовательно, его можно извлечь и обработать. Другой способ взглянуть на это - репозиторий возвращает объект. Эта сущность может либо объединять другие объекты, либо нет. Что касается того, что извлекает репозиторий: я почти уверен, что у синей книги есть изображение на внутренней стороне обложки, которое указывает, что репозиторий загружает сущности и / или AR.   -  person Eben Roux    schedule 28.09.2017


Ответы (2)


Интересно, почему репозитории всегда описываются как используемые специально для агрегатов. Разве не мотивировано использовать его для всех организаций?

Потому что агрегаты - это границы согласованности, представленные на уровне приложения.

То есть, да, репозитории отвечают за получение снимка состояния из хранилища данных и построение из него графа сущностей и значений, составляющих агрегат.

API репозитория предоставляет только совокупный корень, потому что он определяет границу согласованности. Вместо того, чтобы позволить приложению достичь произвольного места на графике и внести изменения, мы заставляем приложение взаимодействовать исключительно с корневым объектом. Имея это ограничение, нам нужно только посмотреть в одном месте, чтобы убедиться, что все изменения удовлетворяют бизнес-инварианту.

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

Другими словами, сущности в агрегате являются частными структурами данных. Мы не позволяем клиентскому коду напрямую манипулировать объектами по той же причине, по которой мы не реализуем списки, которые позволяют клиентам выходить за пределы API и напрямую манипулировать указателями.

В cqrs вы делаете см. «репозитории», которые используются не только для агрегатов, но и для других целей - репозитории также можно использовать для поиска кэшированных представлений о состоянии модели. Хитрость в том, что представления не поддерживают модификацию. В подходе, описанном Эвансом, каждая сущность имеет одно-единственное представление, которое выполняет все ее роли. В CQRS объект и объект могут иметь разные представления в каждой роли, но обычно только одна роль, которая поддерживает изменение объекта.

person VoiceOfUnreason    schedule 27.09.2017
comment
Например: заказ и позиции для агрегата. Если я хочу изменить статус позиции, мне нужно запросить заказ и его позиции по идентификатору заказа, изменить статус позиции через объект заказа и, наконец, вызвать совокупный репозиторий для сохранения. я прав ? - person achilles; 10.09.2020
comment
Другой вопрос: могу ли я обновить статус заказа напрямую по идентификатору заказа (по репозиторию) без получения объекта заказа, статуса обновления и вызова репозитория для сохранения нового обновления? Благодарность - person achilles; 10.09.2020

В DDD есть два типа сущностей: агрегированные корни и вложенные сущности. Как ответил @ VoiceOfUnreason, вам не разрешено изменять вложенные объекты извне Aggregate, поэтому нет необходимости репозиторий для них (под «репозиторием» я имею в виду интерфейс для загрузки и сохранения состояния сущностей). Если бы вам было разрешено, это нарушило бы инкапсуляцию Агрегата, если самые важные вещи в ООП. Инкапсуляция помогает в богатых доменах с множеством и множеством моделей, которым идеально подходит DDD.

person Constantin Galbenu    schedule 27.09.2017