如果我有以下界面:
public interface IQuery<out TResult>
{
}
public interface IQueryHandler<in TQuery, out TResult> where TQuery : IQuery<TResult>
{
TResult Handle<TResult>(TQuery query);
}
public interface IDispatcher
{
TResult Query<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>;
TResult Query<TResult>(IQuery<TResult> query);
}
然后我按如下方式实施IDispatcher
:
public class Dispatcher : IDispatcher
{
// Insert IoC container of your choice here:
// I've tried StructureMap, SimpleInjector and Grace so far,
// they all have the same issue
private readonly Container _container;
public TResult Query<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult>
{
var handler = _container.Resolve<IQueryHandler<TQuery, TResult>();
return handler.Handle(query);
}
public TResult Query<TResult>(IQuery<TResult> query)
{
var handler = _container.Resolve<IQueryHandler<IQuery<TResult>, TResult>();
return handler.Handle(query);
}
}
当我使用open generics注册我的查询处理程序实例时,第一种方法可以正常工作:
var dispatcher = new Dispatcher();
var results = dispatcher.Query<TestQuery, TestResult>(new TestQuery());
但如果我使用较少罗嗦的版本:
var dispatcher = new Dispatcher();
var results = dispatcher.Query(new TestQuery());
然后容器无法解析该类型 - 它无法从IQuery<TestResult>
开始查找IQueryHandler<IQuery<TestResult>, TestResult>
的实现,而它可以从TQuery where TQuery : IQuery<TResult>
开始查找实现IQueryHandler<TQuery, TResult>
。所以我猜测我是否碰到了泛型可以在C#中做的限制,但有没有一种方法可以让我的第二个例子在没有明确说明查询类型和响应类型的情况下工作? / p>
更新:概念验证available here。