是否有一种干净的方式绑定到Ninject中的嵌套通用“通配符”?
我知道我可以通过以下绑定要求任意IThing<T>
:
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可以做到这一点吗?
答案 0 :(得分:2)
简单的答案是:不,你不能用Ninject做到这一点。实际上,使用部分封闭的泛型类型实际支持这种复杂绑定的唯一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会告诉您,当{1}}被请求时,它必须解析FooThing<int>
。