Итак, я запускаю команду на агрегированном корне, и в результате этой команды произошло 10 событий. Эти события являются внутренними, и поскольку внешние системы нуждаются в агрегации этих событий, я решил сделать проекцию (в основном, прочесть прогноз). Чтобы сделать этот прогноз из 10 событий (внутренних) в 1 событие (внешнее), я должен применить некоторые бизнес-правила (бизнес-правила, касающиеся слияния событий). Где я должен помещать эти правила, поскольку он кажется частью домена, но я создаю прогнозы внутренних событий?Прогнозирование модели CQRS - бизнес-логика
В принципе, поскольку логика проектирования является частью домена, я должен держать ее внутри агрегата и называть ее кодом, в котором производится проекция?
ОБНОВЛЕНИЕ
Так, внутри одного агрегатного корня, у меня есть, например, 3 события (внутренние) в качестве ответа на одну команду (aggregate.createPaintandwashatsametime (id, red)), которая отправляется агрегируемому корню и распространяется через все агрегированные корневые объекты, такие как CarCreated (Id), CarSeatColored (Red), CarWashed () и т. д. (все эти 3 события происходят из-за одиночной команды). Внешняя система ожидает получить одно внешнее событие в качестве CarMaintainenceDone (Id, repaintted = true, wash = true, somevalue = 22);
Теперь, если у меня есть какая-то сложная логика, чтобы сделать это CarMaintainenceDone события (например, если (цвет == красный, то в проекции SomeValue == 22 в противном случае 44) - это должно идти в проекции кодах или быть частью домена
UPDATE 2
Позвольте мне дать вам новый пример просто игнорировать, как моделируется домен, так как это просто пример:.
как вы можете видеть, что мы имеем AggregateRoot, который содержит умножитель, который существует только называть вещи правильным именем. Когда мы делаем умножение, мы сначала отправьте целое число 1 в ObjectA, у которого есть некоторая логика, чтобы установить внутреннее состояние и испустить событие ObjectAHasSetParam. То же самое происходит с ObjectB. Наконец, ObjectC прослушивает все эти события, а на paramsHasBeenSet будет выполнять фактическое умножение.
В магазине событий в этом случае я бы сохранить список событий:
[ObjectAHasSetParam , ObjectBHasSetParam , ObjectCHasMultiplied ]
Моя точка здесь была: если я испускают все это события одного за другим из процесса - состояние, что кто-то еще обновления будут возможно, несовместимы, поскольку эти 3 события имеют смысл только вместе. Вот почему я хотел сделать что-то вроде проекции, но я думаю, что в этом случае мне просто нужно публиковать список этих событий вместе вместо события по событию.
class AggregateRoot{
Multiplier ml;
void handle(MultiplyCommand(1,2)){
ml.multiply(1,2);
}
}
class Multiplier{
ObjectA a;
ObjectB b;
ObjectC res;
void multiply(1,2){
a.setParam(1);
b.setParam(2);
publish(paramsHaveBeenSet());
}
}
class ObjectA{
int p;
void setParam(1){
p = 1 + 11;
publish(ObjectAHasSetParam(12));
}
}
class ObjectB{
int p;
void setParam(2){
p = 2 + 22;
publish(ObjectBHasSetParam(24));
}
}
class ObjectC{
int p1; int p2;
int res;
listen(ObjectAHasSetParam e1){
p1 = e1.par;
}
listen(ObjectBHasSetParam e2){
p2 = e2.par;
}
listen(paramsHaveBeenSet e3){
res = p1 * p2;
publish(ObjectCHasMultiplied(288));
}
}
Это странная проблема; вы должны предоставить больше информации о контексте; что происходит, что вы объединяете, и так далее. – VoiceOfUnreason
Что такое «событие внешнего домена» ?! –
Что происходит после события 'CarMaintainenceDone'? Использует ли это 'Car' Aggregate это событие, чтобы изменить его поведение для будущих команд, которые он получает? –