C# ninject中的嵌套泛型通配符绑定

C# ninject中的嵌套泛型通配符绑定,c#,generics,ninject,ninject-2,C#,Generics,Ninject,Ninject 2,有没有一种干净的方法可以绑定到Ninject中的嵌套泛型“通配符” 我知道我可以要求任何带有以下绑定的任意信息: kernel.Bind(typeof(IThing<>)).To(typeof(Thing<>)); kernel.Bind(typeof(IThing)).To(typeof(Thing)); 然而,我真正想要的是任何任意的信息。以下内容在语法上不起作用: kernel.Bind(typeof(IThing<Foo<>>)).To

有没有一种干净的方法可以绑定到Ninject中的嵌套泛型“通配符”

我知道我可以要求任何带有以下绑定的任意
信息

kernel.Bind(typeof(IThing<>)).To(typeof(Thing<>));
kernel.Bind(typeof(IThing)).To(typeof(Thing));
然而,我真正想要的是任何任意的
信息。以下内容在语法上不起作用:

kernel.Bind(typeof(IThing<Foo<>>)).To(typeof(FooThing<>));
kernel.Bind(typeof(IThing<>).MakeGenericType(typeof(Foo<>))).To(typeof(FooThing<>));
kernel.Bind(typeof(IThing)).To(typeof(FooThing));
这在语法上起作用:

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

但ninject不知道该怎么办。Ninject能做到这一点吗?

简单的答案是:不,你不能用Ninject做到这一点。事实上,唯一一个真正支持这种使用部分封闭泛型类型的复杂绑定的DI库是Simple Injector。在简单喷油器中,您可以执行以下操作:

container.RegisterOpenGeneric(
类型(i),
typeof(Thing):MakeGenericType(typeof(Foo));
在您的示例中,您有一个
FooThing
,它可能包含一个嵌套类型约束,如下所示:


public-class-FooThing:i Thing您能否定义一个像
public-interface-IFooThing:i Thing这样的接口?因为这样您就可以像往常一样绑定
kernel.bind(typeof(IFooThing)).to(typeof(FooThing))是的,这当然是一个选项,但我并不真正喜欢“标记接口”这类东西,因为它没有给程序提供任何真正的意义。我宁愿我的代码指定依赖项注入绑定,而不是相反的方式。如果你好奇的话,用例是它实际上是IParser。我想要有可组合的XML解析器。例如,我有一个可以解析成Foo的文档,其中一个节点可以被解析成任何格式,所以有时候T是Bar,有时候是Bat.informational post,谢谢。我不确定这两个注册是否符合我的要求。第二个允许我注册更多的IThing实例吗?你好,Hans。事实上,所有给定的注册都不是您想要的,因为它们是简单注入器的示例,而不是Ninject:-)。与其他DI库相比,Simple Injector更具优势。若你们想知道如何使用简单的注射器,最好是在Stackoverflow这里问一个新问题。对,我理解。我真的不太在乎ninject,这正是我现在正在使用的。DI做得好的一点是,替换框架相当简单。@Hans,没错!DI是关于应用模式和原则;接下来是工具。但这里有一个关于简单注射器的小笑话。如果您有一个(开放的)泛型类型的集合,您可以在简单注入器中注册它们,如下所示:
container.registeral(typeof(IThing)、new[]{typeof(Thing)、typeof(FooThing)、typeof(nongeneriching)、typeof(etc)}
。您可以通过调用
container.GetAllInstances()
或在构造函数中使用集合参数(例如
IEnumerable
)来解析它们。