Указание, какой обработчик использовать с 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");
... и возможность пометить реализации обработчика (на основе пространства имен или чего-то еще) во время установки моего контейнера
Если, конечно, есть лучший, более конкретный и менее последовательный способ!