Конструкция манипулятора команд

#spring #functional-programming

Вопрос:

Я хотел бы создать командный пункт. Вот мои нынешние принципы :

  • Манипулятор команд-это функция. Текущая подпись-дескриптор результата(заголовок CmdHeader, команда Cmd)
  • CommandHandlerMappings-это карта<Предикат, обработчик команд> ; используется контроллером Rest
  • Результат содержит значение и коллекцию событий домена, созданных обработчиком. Плюс mapLeft, mapright, комбинируйте методы. События домена должны быть опубликованы до фиксации tx, чтобы использовать шаблон исходящих сообщений.

Я ищу «простой» дизайн / простоту использования и явный (сегодня я использую AOP для обработки событий домена) :

  • Я попытался сделать обработчик команд для функции<GlobalEnv, Результат> обработчиком(CmdHeader, Cmd). GlobalEnv содержит PlatformTxManager для обработки транзакции и EventPublisher для публикации событий перед фиксацией. Недостатком является то, что сигнатура типа более сложна
  • Извлеките управление Tx и потребление событий за пределы обработчика команд и в Бегун. Недостаток : сложнее понять поток и добавить концепции/объекты. RestController считывает обработчик команд и должен передать этот обработчик в Бегун, который содержит сочетание инфраструктуры (транзакции) / Бизнес-логики (потребление событий)
  • Обертка / состав командных обработчиков. Что-то вроде Фабрики. Например : командный манипулятор composeWithTx(PlatformTransactionManager mgr, командный манипулятор initialHandler). Недостаток : эта функция обрабатывает управление Tx, мне нужно добавить еще одну фабрику для добавления потребления событий и, возможно, третью для управления заказом : потребление событий внутри управления TX

Я хотел бы получить любые советы, лучшие практики. Это первый раз, когда я пробую такой подход ; Я как бы сомневаюсь, куда поместить TxManagement и публикацию DomainEvent : снаружи в бегуне или внутри в качестве «оболочки»командной строки.

Я использовал эти ресурсы :