Можно ли составлять агрегат с неизменяемыми данными из другого агрегата? - PullRequest
0 голосов
/ 06 июля 2019

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

Подробно:

У меня есть BC с двумя агрегатами, скажем, A и B.B требуется немного данных из A для выполнения какой-либо операции, но она никак не изменится.Данные вписываются лучше в A, поскольку существуют правила для их изменения.

Чтение IDDD и PPP DDD, кажется, что приемлемо передать временную ссылку на агрегат (или его субсубъект)другому или передать представление только для чтения в качестве объекта значения в другой агрегат.

В моем примере B не нужен весь агрегат A, а только некоторые конкретные данные, поэтомуобъект значения кажется хорошим подходом в этом случае.A может создать ВО, действующий как фабрика, ВО будет соответствовать UL, и B вообще не нужно знать о A.Бизнес-сценарий на прикладном уровне может восстановить A и B из репозиториев, сказать A для создания VO и выполнить операцию на B прохождении VO.

Предположим теперь, что восстановлениеA стоит дорого, или есть другая причина, по которой нежелательно загружать целое A для создания VO с небольшим количеством информации (возможно, данные не из одного экземпляра A, а агрегированы изсписок их или что угодно).Здесь простое решение можно было бы позволить репозиторию A создать ВО напрямую из хранилища данных.Я чувствую себя комфортно с этим и, кажется, это общий шаблон.

Но сейчас я думаю о случае, когда операция с B выполняется много раз, или, возможно, является частью более крупного вычисления B, что нужно для многих других операций.Я мог бы сослаться на VO с необходимыми данными (как частное, доступное только для чтения свойство B или где-нибудь на его графике) и позволить репозиторию B взять данные, необходимые для создания VO, и восстановить B с этим.Теперь B всегда будет иметь данные локально для выполнения своих операций.Данные, взятые из A, не могут быть изменены;сохранение B через репозиторий просто отбрасывает эти данные (возможно, оно может использовать их для обнаружения конфликтующего одновременного обновления), A и B не всегда будут согласованы, но это нормально, и перезагрузите B изрепозиторий снова запросит данные, чтобы обновить представление внутри B в случае конфликта.

Мне кажется, что этот подход приемлем, поскольку, как я понимаю, модель предметной области не связана с моделью данных, посколькухранилище, действующее как своего рода ACL между ними.Также существует единый источник правды для данных внутри A, поскольку копия внутри B является неизменной и в конечном итоге непротиворечивой.Недостатки, которые я вижу, состоят в том, что в хранилище будет больше логики (но не бизнес-логики), и что может быть неясно, откуда именно поступают данные, поскольку зависимость от B до A теперь скрыта внутри инфраструктурного кода.

Итак, вопросы таковы:

  1. Это не очень хороший подход в конце концов?
  2. Есть ли еще один недостаток, который яне вижу?
  3. Вы или кто-то сделал что-то подобное, чтобы я мог извлечь уроки из этого опыта?

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

1 Ответ

0 голосов
/ 06 июля 2019

допустимо ли позволить хранилищу запрашивать некоторые данные из другого агрегата для создания агрегата?

Приемлемый вид слабо определяется. Лучше задать вопрос: «есть ли негативные последствия?»

В этом примере обычно рассматривается, становится ли система труднее изменить. Взгляните на выступление Адама Ральфа о границах обслуживания , чтобы понять, что происходит, когда вы не контролируете связь между компонентами.

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

См. Также статью Пэта Хелланда: Данные снаружи и данные внутри. .

...