Как посмотреть, к какому агрегату относится сущность? - PullRequest
1 голос
/ 07 июля 2019

Иногда мне нужно запустить команду, зная только идентификатор сущности, но не агрегат, к которому она принадлежит.

Например:

У меня есть Order агрегатные корни, к которымInvoice ы принадлежат.Затем при регистрации фактического платежа по счету-фактуре доступен только идентификатор Invoice.

Я могу сохранить отдельную таблицу / коллекцию "Счета-фактуры", где каждый документ / строка имеет только Order ID, и только когда-либо вставляйте в него при публикации события InvoiceCreated.

(или таблица общего назначения Entities, где каждый элемент будет чем-то вроде {type: "invoice", ag: <ID>}, возможно, добавит agType: "order")

Это кажется проблематичным, но я не уверен, каким образом.

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

Однако, делая это, когда / до публикуем событие, против когда /после применения это кажется необычным.

Какое здесь стандартное решение?

Обновление 1

Полагаю, одна проблема, которая приходит на ум, заключается в том, что, поскольку этозаполняется при публикации, а некогда применяется то, что наивное воспроизведение событий не воссоздает эту таблицу.Однако данные точно есть в потоке событий.И, кроме того, вряд ли когда-нибудь понадобится обстреливать эту таблицу из-за ее глупой простоты.Его можно сохранить независимо от изменений в схеме агрегатного состояния.Так что это не сильный аргумент против.

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Если вы знаете только идентификатор объекта, это означает, что ваша совокупная граница, вероятно, неверна. Команды всегда выполняются в области агрегата, и по определению шаблона агрегации все идентификаторы сущности являются внутренними для агрегата, и никогда не должно быть возможности ссылаться на объект извне агрегата напрямую.

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

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

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

Отдельная таблица с идентификатором заказа и счета-фактуры является допустимым подходом.Это сделало бы еще один прогноз, который можно легко воссоздать путем воспроизведения событий.Вероятно, у вас уже есть таблица проекций Invoice.Почему бы не разместить там идентификатор заказа?

...