2

我有以下类,用于对数据库进行特定查询并创建数据的表示模型以传回客户端浏览器。

public class SpecificFooQuery: IPresentationQuery<FooRequest, FooResult>
{
    public SpecificFooQuery(ILogger logger, DbContext context)
    {
        this.logger = logger;
        this.context = context;
    }

    public FooResult Get(FooRequest request)
    {
        return new FooResult { ... };
    }
}

它实现了以下通用接口

public interface IPresentationQuery<TRequest, TResult>
    where TRequest : class
    where TResult : class
{
    TResult Get(TRequest request);
}

但是我在编写将为我创建对象的 ninject 实例时遇到问题。这不起作用,但到目前为止我还没有真正做到这一点。

kernel.Bind<IPresentationQuery<FooResult, FooRequest>>().To<SpecificFooQuery>();

任何人都可以帮我解决这个问题,我不确定我哪里出错了,或者我需要做什么才能完成这项工作。


Error   1   
The type 'SpecificFooQuery' cannot be used as type parameter 
'TImplementation' in the generic type or method   
'Ninject.Syntax.IBindingToSyntax<T1>.To<TImplementation>()'. 
There is no implicit reference conversion from 
'SpecificFooQuery' to 'IPresentationQuery<FooResult,FooRequest>'.   
4

2 回答 2

3

我知道这个问题是关于 Ninject 的,但如果你正在做这种通用的把戏,你可能想试试Simple Injector。它允许您IPresentationQuery<TRequest, TResult>在一行代码中注册所有实现,如下所示:

container.RegisterManyForOpenGeneric(
    typeof(IPresentationQuery<,>),
    typeof(IPresentationQuery<,>).Assembly);

RegisterManyForOpenGenericSimpleInjector.Extensions项目的扩展方法,可以像 Simple Injector 一样从 NuGet 下载。

并且用通用装饰器包装所有这些实现也将是单行的:

container.RegisterDecorator(
    typeof(IPresentationQuery<,>),
    typeof(ValidationPresentationQueryDecorator<,>));

Simple Injector 的优点在于它的速度非常快,即使在处理通用装饰器时也是如此。Simple Injector 甚至尊重您的泛型类型约束。您将泛型类型约束添加到装饰器以防止它被包装到某些类型。如果这是不可能的,你也可以像这样注册一个条件装饰器:

container.RegisterDecorator(
    typeof(IPresentationQuery<,>),
    typeof(ValidationPresentationQueryDecorator<,>),
    context => NeedsValidation(context.ImplementationType));

即使这个注册被优化并且提供的谓词只会被每个封闭的泛型类型调用一次。RegisterDecorator方法是同一个扩展项目的一部分RegisterManyForOpenGeneric

于 2012-11-26T16:46:16.963 回答
1

看来您的类型参数的顺序是错误的。您尝试绑定IPresentationQuery<FooResult, FooRequest>IPresentationQuery<FooRequest, FooResult>.

于 2012-11-26T16:05:58.460 回答