Указание, какой обработчик использовать с CQRS с Mediatr

Я работаю в системе, где я начал использовать Mediatr для разделения наших команд / запросов.

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

Один такой запрос GetAccountInformation

Вероятно, лучше проиллюстрировать с помощью кода...

Итак, в настоящее время, в "ядре" пространства имен / сборки, у меня есть

public class GetAccountInformationRequest : IAsyncRequest<AccountInformation>
{
    public string AccountReference {get; set}
}

Затем обработчик ядра выглядит примерно так:

public class GetAccountInformationRequestHandler :       
    IAsyncRequestHandler<GetAccountInformationRequest , AccountInformation>
{
    private readonly IMediator _mediator;

    public GetAccountInformationRequestHandler(IMediator mediator)
    {
        _mediator = mediator;
    }

    public async Task<AccountInformation> Handle(GetAccountInformationRequest request)
    {
        //this sends a different request off to another handler which determines which sub system to use
        var subSystem = await _mediator.SendAsync(new GetAccountSubSystemRequest(request.AccountReference));

        //this is rubbish, but I've only done this to illustrate the kind of thing I need to do
        if(subSystem == 'SystemA')
            return await _mediator.SendAsync(new SystemA.GetAccountInformationRequestFromSystemRequest(request.AccountReference));
        if(subSystem == 'SystemB')
            return await _mediator.SendAsync(new SystemB.GetAccountInformationRequestFromSystemRequest(request.AccountReference));
        if(subSystem == 'SystemC')
            return await _mediator.SendAsync(new SystemC.GetAccountInformationRequestFromSystemRequest(request.AccountReference));

        throw new Exception("Unknown sub system");
    }
}

Как вы видите, я получил дополнительные пространства имен (в отдельных сборках) с конкретными запросами в.
Это действительно немного мусора.

Для начала мне кажется, что здесь много дублирования - на самом деле, мне просто нужны конкретные обработчики

И очевидное нарушение Open/Closed!

Чувствуется почти так, как будто я должен быть в состоянии сделать что-то вроде

_mediator.SendAsync(request, "SystemA");

... и возможность пометить реализации обработчика (на основе пространства имен или чего-то еще) во время установки моего контейнера

Если, конечно, есть лучший, более конкретный и менее последовательный способ!

0 ответов

Другие вопросы по тегам