1
我正在編寫一個應用程序,它針對不同的客戶端具有不同的類實現。我們正在使用CQRS,並且我想爲每個客戶端添加不同的命令和查詢實現(如果沒有客戶端特定的客戶端,則默認爲默認值)。基於屬性的Unity容器解析
該應用程序以前編寫只有一個客戶端,這工作正常,但現在我們需要重寫爲每個客戶端的命令和客戶端。我已經提出了許多關於如何做到這一點的想法,但這種感覺最清晰,因爲只需添加一組查詢/命令即可輕鬆添加新客戶端。
調度該查詢的代碼如下:
public InProcQueryDispatcher(
IQueryHandlerFactory queryHandlerFactory,
Action<Exception, IQuery> onHandlerFailed)
{
this.queryHandlerFactory = queryHandlerFactory;
this.onHandlerFailed = onHandlerFailed;
this.getHandlerMethod = typeof(IQueryHandlerFactory).GetMethod("GetHandler");
}
public async Task<TResult> Execute<TResult>(IQuery<TResult> query)
{
if (query == null)
{
throw new ArgumentNullException();
}
try
{
var queryHandler = this.ResolveHandler<TResult>(query.GetType());
var task = (Task<TResult>) queryHandler.Handle((dynamic) query);
return await task;
}
catch (Exception ex)
{
this.onHandlerFailed(ex, query);
throw;
}
}
private dynamic ResolveHandler<TResult>(Type queryType)
{
var getHandler = this.getHandlerMethod.MakeGenericMethod(queryType, typeof (TResult));
return getHandler.Invoke(this.queryHandlerFactory, null);
}
}
我現在希望能夠改變它,如下所示:
`public async Task<TResult> Execute<TResult>(IQuery<TResult> query)
{
if (query == null)
{
throw new ArgumentNullException();
}
try
{
var queryHandler = this.ResolveHandler<TResult>(query.GetType(), query.ClientId);
var task = (Task<TResult>) queryHandler.Handle((dynamic) query);
return await task;
}
catch (Exception ex)
{
this.onHandlerFailed(ex, query);
throw;
}
}
private dynamic ResolveHandler<TResult>(Type queryType, Guid clientId)
{
var getHandler = this.getHandlerMethod.MakeGenericMethod(queryType, clientId, typeof (TResult));
return getHandler.Invoke(this.queryHandlerFactory, null);
}
誰能推薦我怎麼可以更新我的getHandleMethod解決基於clientID的正確查詢?
GetHandleMethod:
public IQueryHandler<TQuery, TResult> GetHandler<TQuery, TResult>() where TQuery : class, IQuery<TResult>
{
return container.Resolve<IQueryHandler<TQuery, TResult>>();
}