Я вижу это так:
Ваши агрегаты - это Ядро
Обработчиками сообщений являются сценарии использования, которые используют зависимости ( как интерфейсы репозитория) и ядро для выполнения бизнес-прецедента.
Существует инфраструктурный код, который просматривает сообщения из очереди и запускает варианты использования
При таком подходе вы можете выполнить модульное тестирование вариантов использования без беспокоиться об инфраструктуре, и вы можете заменить всю технологию очереди сообщений. Тот же подход работает для обработки запросов API. На практике единственное отличие состоит в том, что с помощью API вы можете возвращать ответ синхронно, а с помощью обмена сообщениями - нет.
В качестве практического замечания, в. NET Я использую библиотеку под названием Mediatr для реализации и запуска вариантов использования. В java я обнаружил PipelinR , который выглядит с первого взгляда. Этот тип подхода позволяет вам реализовать все варианты использования одинаково для всех ваших синхронных и асинхронных применений.