#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 : снаружи в бегуне или внутри в качестве «оболочки»командной строки.
Я использовал эти ресурсы :
- Вызов службы : https://www.lagomframework.com/documentation/1.6.x/scala/ServiceImplementation.html
- Маршрутизатор/функциональный манипулятор : https://www.baeldung.com/spring-5-functional-web
- Читатель Монад : https://medium.com/@johnmcclean/dependency-injection-using-the-reader-monad-in-java8-9056d9501c75
- Опишите проблему / запуск, используя пример Par[A]: https://www.manning.com/books/functional-programming-in-scala