我正在构建一个通用查询调度程序。想法如下:
- 通用接口
IQuery<T>
代表一个查询对象
- 一个具体的查询类有一些 getter 和 setter(实现
IQuery<T>
)
- 通用接口
IQueryHandler<TReturnType, TQuery>
使用一个接收 TQuery 的方法(有一个约束TQuery: IQuery<TReturnType>
)并返回一个TReturnType
- 具体处理程序实施
IQueryHandler
接收混凝土ConcreteQuery
并返回一个 TQuery
- A
QueryDispatcher
它有一个接收查询并返回结果的方法。具体类将从 DI 容器中查找正确的处理程序。
问题是当我调用时我没有得到类型推断Fetch
方法上的QueryDispatcher
。我可以做些什么来获得类型推断,还是这只是 C# 的限制?
理论上它应该知道类型参数是什么,因为它接收一个参数TQuery
这有一个限制:IQuery<TReturnType
.
这是代码:
class ConcreteClass // This is the class of which I want to query objects
{
}
查询接口+具体查询类
interface IQuery<T>
{
}
public class ConcreteQuery : IQuery<ConcreteClass>
{
}
QueryHandler 接口 + 具体查询处理程序
interface IQueryHandler<TReturnType, TQuery> where TQuery : IQuery<TReturnType>
{
TReturnType Fetch(TQuery query);
}
class ConcreteQueryHandler : IQueryHandler<ConcreteClass, ConcreteQuery>
{
ConcreteClass Fetch(ConcreteQuery query)
{
}
}
QueryDispatcher(使用 DI 容器来解析正确的处理程序)
class QueryDispatcher
{
TReturnType Fetch<TReturnType, TQuery>(TQuery query)
where TQuery : IQuery<TReturnType>
{
return myDIcontainer.Get<IQueryHandler<T, TQuery>>().Fetch(query);
}
}
现在,当我像这样使用 QueryDispatcher 时,出现错误:
var queryDispatcher = new QueryDispatcher();
var c = queryDispatcher.Fetch(new ConcreteQuery());
当我提供类型参数时,一切正常:
var c = queryDispatcher.Fetch<ConcreteClass, ConcreteQuery>(new ConcreteQuery());