Как применять инварианты в агрегатных отношениях - PullRequest
0 голосов
/ 22 сентября 2019

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

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

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

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

Мой второй подход состоял в том, чтобы иметь отдельную компаниюАктивность агрегации.Это означает, что мне сначала нужно вызвать событие ActivityCreated, а затем событие ActivityAddedToCompany, которое вызовет исключение, если компания уже полна Activity.Этот подход кажется лучше, но я не уверен, что необходимость в ActivityAddedToCompany - это признак того, что я неправильно разделил агрегаты, как в случае удачного пути, ActivityCreated и ActivityAddedToCompany всегда будут храниться после друг друга.

Isвторой подход лучше, или я упускаю что-то базовое в домене Driven Design?

1 Ответ

0 голосов
/ 27 сентября 2019

В соответствии с вашими пояснениями:

Деятельность не должна быть создана Компанией

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

Деятельность может быть зарегистрирована только для одной Компании

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

Компания может одновременно иметь только 5 видов деятельности

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

Когда вы назначаете деятельность для компании (команда AssignToCompany ), вы вызываете событие AssignedToCompany .ProcessManager (PM) получит это событие и отправит команду в Компанию ( AssignToActivity ), и Компания может либо принять ( AssignedToActivity ), либо отклонить ее на основании количества ()RejectedAssignToActivity ).

Если последний, премьер-министр получит событие RejectedAssignToActivity и отправит команду в Activity для удаления компании ( UnassignCompany ), которая вызовет CompanyUnassigned событие.

Необязательно:

PM получает событие CompanyUnassigned и отправляет команду UnassignFromActivity в Компанию.Таким образом, вы можете отменить назначение операции, если это необходимо, и уведомить Компанию об изменениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...