gpt4 book ai didi

c# - ninject 中的嵌套通用通配符绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:30 25 4
gpt4 key购买 nike

在 Ninject 中是否有一种干净的方法来绑定(bind)到嵌套的通用“通配符”?

我知道我可以要求任意IThing<T>具有以下绑定(bind):

kernel.Bind(typeof(IThing<>)).To(typeof(Thing<>));

然而,我真正想要的是任意IThing<Foo<T>> .以下在句法上不起作用:

kernel.Bind(typeof(IThing<Foo<>>)).To(typeof(FooThing<>));

这在句法上有效:

kernel.Bind(typeof(IThing<>).MakeGenericType(typeof(Foo<>))).To(typeof(FooThing<>));

但是 ninject 不知道如何处理它。 Ninject 能做到这种事吗?

最佳答案

简单的回答是:不,你不能用 Ninject 做到这一点。事实上,唯一真正支持这种使用部分封闭泛型类型的复杂绑定(bind)的 DI 库是 Simple Injector。在 Simple Injector 中,您可以这样做:

container.RegisterOpenGeneric(
typeof(IThing<>),
typeof(Thing<>).MakeGenericType(typeof(Foo<>)));

在您的示例中,您有一个 FooThing<T>可能包含如下嵌套类型约束:

public class FooThing<T> : IThing<Foo<T> { }

同样,Ninject 不支持这一点。我相信 Autofac 在某种程度上对此有一些支持,但只有 Simple Injector 能够为您解决几乎所有奇怪和复杂的泛型类型约束的类型。在 Simple Injector 中,注册很简单:

container.RegisterOpenGeneric(typeof(IThing<>), typeof(FooThing<>));

Simple Injector 会为您发现它必须解决 FooThing<int>IThing<Foo<int>>被要求。

关于c# - ninject 中的嵌套通用通配符绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29463086/

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