Я работаю над проектом, в котором мы определяем два агрегата: Project и Task. Проект, в дополнение к другим атрибутам, имеет атрибут точек. Эти баллы распределяются по задачам по мере их определения пользователями. В варианте использования пользователь назначает баллы за какую-то задачу, но в проекте эти баллы должны быть доступны. В настоящее время мы моделируем это следующим образом:
- «task.RequestPoints(points)», этот метод создаст агрегированное PointsAssignment с атрибутами points и taskId, которое в своем конструкторе выдает доменное событие PointsAssignmentRequested.
- Обработчик выданного события извлечет проект, связанный с задачей, и агрегат PointsAssigment и вызовет метод «project.assignPoints(pointsAssigment, service)», то есть передаст агрегат PointAssignment в качестве параметра и сервис для расчета разница между текущими баллами задачи и желаемыми баллами. Если точки доступны, проект изменит свой атрибут точек и вызовет доменное событие «ProjectPointsAssigned», которое будет содержать атрибут pointsAssignmentId (в дополнение к другим)
- Обработчик этого последнего события извлечет PointsAssingment и подтвердит «pointsAssigment.Confirm()», этот агрегат выдаст доменное событие PointsAssigmentConfirmed.
- Обработчик этого последнего события вызовет связанную задачу и вызовет «task.AssignPoints (pointsAssignment.points)».
У меня вопрос: правильно ли передать на шаге 2 агрегатное присвоение баллов в методе проекта? Это был единственный способ, которым я нашел возможность связать агрегаты. Примечание. Мы создали агрегат PointsAssignment, чтобы в случае сбоя я мог сохранить ошибку «pointsAssignment.Reject(reasonText)» и отобразить ее пользователю, поскольку я использую итоговую согласованность (1 агрегат на транзакцию).
Мы думаем об использовании диспетчера процессов (PointsAssingmentProcess), но точно так же нам нужен третий совокупный PointsAssingment для корреляции этого процесса.