使用Mediatr

时间:2015-08-10 23:24:41

标签: c# architecture cqrs mediator 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");
    }
}

正如您所看到的,我已经获得了具有特定请求的其他命名空间(在单独的程序集中) 这确实感觉有点垃圾。

首先,感觉这里有很多重复 - 真的,我只需要特定的处理程序

明显违反开放/封闭!

感觉几乎就像我需要能够做一些像

这样的事情
_mediator.SendAsync(request, "SystemA");

...并且能够在容器设置期间“标记”处理程序的实现(基于命名空间或其他内容)

除非当然有更好,更具体,更少基于字符串的方式!

0 个答案:

没有答案