Если часто имеет смысл моделировать процессы как истории связанных событий.Вы можете представить это как журнал действий, связанных с конкретным запросом.Представьте, что кто-то получает сообщения из разных отделов и записывает их в книгу
Request #12354 submitted.
Request #12354 received level 2 approval: details....
Request #12354 received level 3 approval: details....
Чтобы выяснить, какую работу нужно выполнить дальше, просто просмотрите то, что уже произошло.Загрузите все события, сложите их в представление в памяти и затем запросите эту структуру.
Где лежит ответственность за определение того, кто следующий менеджер в цепочке должен назначить запрос?
Нечто подобное может быть реализовано в доменной службе;если агрегат не содержит информации, которая ему необходима для работы, он должен попросить кого-то еще.
Обычным шаблоном для этого может быть служба без сохранения состояния, которая знает, как найти подходящего менеджера., учитывая набор значений, которые описывают состояние агрегата.Агрегат знает, в каком состоянии он находится, поэтому он передает значения, описывающие его состояние, службе, чтобы получить ответ.
Manager levelFourManager = managers.getLevelFourManager(...)
Куда идет логика, которая определяет это, потому что я не знаютребовать каких-либо промежуточных разрешений, которые должны поступать прямо в отдел обработки?
Возможно, в конечном итоге в сам агрегат.
Ринат Абдуллин составил очень хорошее руководство по процессу развитияменеджеры , что очень соответствует разговору Грега Янга Stop Over Engineering .
У вас есть запрос в вашей модели, например
request.isReadyForProcessing()
В ранних версиях вашей модели запрос мог отвечать false, пока какой-нибудь оператор не сказал ему «да, вы готовы»;затем со временем вы начнете добавлять в простые случаи для вычисления.
boolean isReadyForProcessing() {
return aHumanSaidImReadyForProcessing() || ImOneOfTheEasyCasesToProcess();
}
Что на самом деле означает «отправить в обработку», вероятно, не в совокупности.Мы могли бы снова позаимствовать идею доменного сервиса, на этот раз для связи с внешней системой
void notify(ProcessingClient client) {
if (this.isReadyForProcessing()) {
client.process(this.id);
}
}
Возможно, клиент обработки выполняет реальную работу или просто отправляет сообщение куда-то еще - агрегатная модельна самом деле все равно.
Частью модели домена *, как образца, является то, что наш домен требует координации / оркестрации сообщений между объектами в модели.Если бы нам не нужна была такая сложность, мы бы, вероятно, посмотрели на что-то более прямолинейное, например сценарии транзакций .Печатная версия Patterns of Enterprise Application Architecture посвящает их описанию на нескольких страницах.
Если есть отклонения с изменениями, как нам вернуться к предыдущим уровням - Iрассмотрели какую-то сущность StatusHistory.
Да, это - RejectWithModifications
- это просто еще одно сообщение для записи в книгу, и это дает вам больше информации для рассмотрения при ответах на вопросы.
Request #12354 submitted.
Request #12354 received level 2 approval: details....
Request #12354 received level 3 approval: details....
Request #12354 rejected with modifications: details....
Я понимаю, что вы говорите, и это имеет большой смысл.Я все еще погружаюсь в детали реализации.
- Это не ваша вина.
- Литература слабая.
позволяет ли журнал событий называть его ActivityLog live для агрегата Request или его собственный агрегат, как в образцах Cargo DDD?
Помещение в агрегат, вероятно, является подходящим местом для начала;это может не остаться там.Найти приличный локальный минимум для вашей текущей системы, вероятно, лучше, чем пытаться найти глобальный минимум сразу.
Существуют ли различия между событиями домена согласно синей книге Эванса и более поздними событиями домена.
Возможно;это также запутано, потому что доменные события не обязательно обязательно , о которых люди говорят, когда говорят «источник событий».
Нужно видеть древесину для деревьев.
Единственное, что сработало для меня, - это регулярно возвращаться к первым принципам, шаг за шагом прорабатывать решения и наблюдать, как ястреб, за неявными предположениями.