Где разместить доменные сервисы в AxonIQ - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть пользовательский агрегат, который создается с помощью команды CreateUser, которая состоит из идентификатора агрегата и имени пользователя.

Наряду с этим у меня есть доменная служба, которая связывается с mongo db и проверяет, существует ли имя пользователя, если нет, то он помещаетэто там.например, registerUsername (username) -> true / false независимо от того, зарегистрировал ли он это или нет

Мой вопрос: будет ли хорошей идеей создать обработчик команд поверх пользовательского агрегата, который будет обрабатывать команду CreateUser, и будет ли онимеет имя пользователя или нет будет отправлять соответствующие команды / события?вот так:

@Component
class UserCommandHandler(
    @Autowired
    private val repository: Repository<User>,
    @Autowired
    private val eventBus: EventBus,
    @Autowired
    private val service: UniqueUserService
) {

@CommandHandler
fun createUser(cmd: CreateUser) {
    if (this.service.registerUsername(cmd.username)) {
        this.repository.newInstance { User(cmd.id) }
                .handle(GenericCommandMessage(cmd))
    } else {
        this.eventBus.publishEvent(UserCreateFailed(cmd.id, cmd.username))
    }
}
}

Этот вопрос не обязательно связан с уникальностью набора в DDD, но больше вопрос, где я должен поставить зависимость доменных служб?Я мог бы, вероятно, создать сагу регистрации пользователей и внедрить эту службу в сагу, но я думаю, что сага должна полагаться только на диспетчеризацию команд и не иметь никакой логики if / else.

1 Ответ

0 голосов
/ 01 марта 2019

Я думаю, что место для размещения службы вашего домена зависит от варианта использования под рукой.Обычно я стараюсь, чтобы доменная служба вообще не выполняла виртуальные исходящие вызовы другим службам или базам данных.

Доменная служба, которую вы сейчас задумываете, однако делает именно это, как вы отметили, для решениявопрос уникальности.В этой ситуации вы, вероятно, могли бы прийти с предложенным подходом.

Вы также можете подумать о введении MessageHandlerInterceptor (или даже более необычно, HandlerEnhancerDefinition, как описано здесь ),в частности, запуск по команде create и выполнение требуемой проверки.

Если бы это была доменная служба, как я только что описал мою (например, ноль исходящих вызовов от доменной службы), то вы можете безопасно подключить ее к обработке вашей командыфункции для выполнения каких-либо действий.

Если вы находитесь в среде Spring, просто иметь доменную службу в качестве компонента и предоставить ее в качестве параметра для вашей функции обработки сообщений, чтобы Axon разрешил ее для вас (с помощью ParameterResolvers, как описано здесь ).

Надеюсь, это поможет вам @PolishCivil!

...