Где разместить доменные службы в AxonIQ

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

Наряду с этим у меня есть служба домена, которая связывается с mongo db и проверяет, существует ли имя пользователя, если не помещает его туда. например, registerUsername (имя пользователя) -> 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.


person PolishCivil    schedule 27.02.2019    source источник


Ответы (1)


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

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

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

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

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

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

person Steven    schedule 01.03.2019