ninject中嵌套的通用通配符绑定

时间:2015-04-05 22:48:00

标签: c# generics ninject ninject-2

是否有一种干净的方式绑定到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可以做到这一点吗?

1 个答案:

答案 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>