我正在构建一个通用的查询调度程序。其思想如下:
- 一个泛型接口IQuery代表一个查询对象 - 一个具体的查询类具有一些getter和setter(实现了IQuery) - 一个泛型接口IQueryHandler,具有一个单独的方法,该方法接收TQuery(对TQuery有一个约束:TQuery: IQuery),并返回TReturnType - 实现IQueryHandler的具体处理程序,接收一个具体的ConcreteQuery并返回一个TQuery - 一个QueryDispatcher,它有一个单独的方法,该方法接收一个查询并返回结果。具体的类将从DI容器中查找正确的处理程序。
问题是当我在QueryDispatcher上调用Fetch方法时,我无法得到类型推断。有没有什么办法可以获得类型推断,或者这只是C#的限制?
理论上,它应该知道类型参数是什么,因为它接收一个TQuery的参数,而TQuery的约束是一个IQuery。
以下是代码:
查询调度程序(使用 DI 容器解析正确的处理程序)。
现在当我像这样使用QueryDispatcher时,会出现错误:
当我提供类型参数时,一切正常运作:
- 一个泛型接口IQuery代表一个查询对象 - 一个具体的查询类具有一些getter和setter(实现了IQuery) - 一个泛型接口IQueryHandler,具有一个单独的方法,该方法接收TQuery(对TQuery有一个约束:TQuery: IQuery),并返回TReturnType - 实现IQueryHandler的具体处理程序,接收一个具体的ConcreteQuery并返回一个TQuery - 一个QueryDispatcher,它有一个单独的方法,该方法接收一个查询并返回结果。具体的类将从DI容器中查找正确的处理程序。
问题是当我在QueryDispatcher上调用Fetch方法时,我无法得到类型推断。有没有什么办法可以获得类型推断,或者这只是C#的限制?
理论上,它应该知道类型参数是什么,因为它接收一个TQuery的参数,而TQuery的约束是一个IQuery。
以下是代码:
class ConcreteClass // This is the class of which I want to query objects
{
}
查询接口 + 具体查询类
interface IQuery<T>
{
}
public class ConcreteQuery : IQuery<ConcreteClass>
{
}
查询处理程序接口 + 具体的查询处理程序
interface IQueryHandler<TReturnType, TQuery> where TQuery : IQuery<TReturnType>
{
TReturnType Fetch(TQuery query);
}
class ConcreteQueryHandler : IQueryHandler<ConcreteClass, ConcreteQuery>
{
ConcreteClass Fetch(ConcreteQuery query)
{
}
}
查询调度程序(使用 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());
var
改为实际类型,会有帮助吗? - Yair Nevet