我正在开发一个系统,我已经开始使用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");
...并且能够在容器设置期间“标记”处理程序的实现(基于命名空间或其他内容)
除非当然有更好,更具体,更少基于字符串的方式!