基于这篇精彩的CQRS文章,我定义了以下接口:
public interface IQuery<TResult>
{
}
public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
TResult Handle(TQuery query);
}
Run Code Online (Sandbox Code Playgroud)
实现通用异步QueryHandler的最佳方法是什么?到目前为止,我有一个新的接口定义来将Handle()方法更改为void并接受新的"Complete"事件处理程序.就像是:
public interface IQueryHandlerAsync<TQuery, TResult> where TQuery : IQuery<TResult>
{
void Handle(TQuery query, RunWorkerCompletedEventHandler complete);
}
Run Code Online (Sandbox Code Playgroud)
我可以为实现IQueryHandlerAsync接口的所有查询处理程序创建新的具体类,例如:
public class FindUsersBySearchTextQueryHandlerAsync
: IQueryHandlerAsync<FindUsersBySearchTextQuery, User[]>
{
private readonly IQueryHandler<FindUsersBySearchTextQuery, User[]> queryHandler;
public FindUsersBySearchTextQueryHandler(IQueryHandler<FindUsersBySearchTextQuery, User[]> queryHandler)
{
this.queryHandler = queryHandler;
}
public void Handle(FindUsersBySearchTextQuery query, RunWorkerCompletedEventHandler complete)
{
var worker = new BackgroundWorker();
worker.DoWork += DoWork;
worker.RunWorkerCompleted += complete;
worker.RunWorkerAsync(query);
}
void …Run Code Online (Sandbox Code Playgroud)