gpt4 book ai didi

c# - 编写/编译通用 Ninject 绑定(bind)的问题

转载 作者:行者123 更新时间:2023-11-30 21:02:20 29 4
gpt4 key购买 nike

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

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 { ... };
}
}

它实现了下面的通用接口(interface)

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>'.

最佳答案

我知道这个问题是关于 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 相同的扩展项目的一部分是。

关于c# - 编写/编译通用 Ninject 绑定(bind)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13568505/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com