У вас может быть модульный интерфейс для этого, но я не вижу трех отдельных доменов в том, что вы описываете обязательно.
Во-первых, в CQRS отчетность не связана напрямую с моделью домена, она является аспектом отдельной модели чтения, которая берет на себя ответственность за представление состояния домена, оптимизированного для отчетов.
Во-вторых, только потому, что в области происходят разные вещи, не обязательно есть причина, чтобы связывать их друг с другом. Я бы прочитал синюю книгу DDD, чтобы лучше понять, как выглядят BC.
Я не совсем понимаю ваш домен, но постараюсь дать несколько общих советов.
Начните с того, где вы говорили о вашем PublishingService. Я вижу совокупный корень спецификации, который принимает несколько команд, которые, вероятно, выглядят как CreateNewSpecification, UpdateSpecification и PublishSpecification.
События выглядят аналогично и, вероятно, кажутся избыточными: SpecificationCreated, SpecificationUpdated, SpecificationPublished. Какой тип отстой, но тяжелая модель CRUD не очень интересное поведение. Я бы также предложил найти автоматический способ справиться с изменениями модели / схемы в этом агрегате, что будет утомительно, если вы не используете генерацию кода или обрабатываете изменения динамическим * выделенным текстом * способом, который не требует от вас создавать новые события каждый раз.
Также вы можете просто не использовать источники событий для такого агрегатного корня, поскольку он очень тяжелый CRUD.
Вторая вещь, которую вы описываете, похоже, касается запуска симуляции, которая будет работать на основе спецификации и производить данные во время этой симуляции (я полагаю). Архитектура, управляемая событиями, имеет здесь смысл разъединять обновление отчетных данных от процесса, который их производит. Это дает огромные преимущества, если вы создаете большие объемы данных для обработки.
Однако это не похоже на симуляцию, это обязательно тот тип AR, который также выиграет от Event Sourcing. По нескольким причинам:
- Симуляция действительно требует только одну Команду, которая похожа на StartSimulation
- Затем симуляция создает события в течение своего срока службы, которые представляют то, что происходит внутри с симуляцией
- Кажется, что симуляция не получает никаких других команд, которые могут зависеть от текущего состояния симуляции
- Симуляция не взаимодействует с несколькими клиентами / пользователями одновременно, и, как мы указали, она вообще не взаимодействует с
В целом, моделирование предметной области очень специфично для каждого отдельного проекта, поэтому сложно предоставить вам всю информацию, необходимую для построения модели предметной области. Это произойдет в результате того, что вы потратите много времени, пытаясь понять потребности ваших пользователей и проблему, которую они пытаются решить с помощью программного обеспечения. Скорее всего, он будет проходить через несколько усовершенствований, когда вы будете лучше понимать их процесс.