C# Ninject按约定绑定不使用泛型类型

C# Ninject按约定绑定不使用泛型类型,c#,generics,dependency-injection,ninject,ninject-extensions,C#,Generics,Dependency Injection,Ninject,Ninject Extensions,我使用的.NET 4.5、Ninject 3如下所示: kernel.Bindx=>x .FromAssembliesMatchingassembly.dll 。选择AllClasses.InheritedFromtypeofICommandHandler .BindAllInterfaces; 本文件适用于: 公共类MyCommandHandler:ICommandHandler 但并不约束: 公共类MyGenericCommandHandler:ICommandHandler 但是,如果我为

我使用的.NET 4.5、Ninject 3如下所示:

kernel.Bindx=>x .FromAssembliesMatchingassembly.dll 。选择AllClasses.InheritedFromtypeofICommandHandler .BindAllInterfaces; 本文件适用于:

公共类MyCommandHandler:ICommandHandler 但并不约束:

公共类MyGenericCommandHandler:ICommandHandler 但是,如果我为泛型类的特定实现添加单独的绑定,则前面的绑定可以工作,例如:

kernel.BindtypeofICommandHandler .TotypeofMyGenericCommandHandler kernel.BindtypeofICommandHandler .TotypeofMyGenericCommandHandler 但是添加每个单独的泛型类型违背了约定的目的,需要为每个可能的单独类型(如float、int、string等)添加绑定

您知道如何修改约定或添加另一个约定,甚至 提供一个完全不同的解决方案来支持通用 我的命令的版本?i、 e.支持两级泛型


编辑:不编译[而且事实上它没有揭示需求没有意义],请参见注释中的结论推理

这只是正常的开放泛型案例。正如我之前评论中的一个链接所暗示的那样,基本绑定让你看起来干巴巴的方式很简单:

kernel.Bind(typeof(ICommandHandler<MyGenericCommand<>>))
    .To(typeof(MyGenericCommandHandler<>));
然后,该绑定将足以满足ICommandHandler的任何T变体

在执行基于约定的绑定以映射所需内容的上下文中,问题在于SelectAllClasses.InheritedFromtypeofICommandHandler不包括泛型类-这很有意义,因为很少可以在非具体类上指定泛型规则

你也可以

使用DSL的不同投影部分来选择泛型类,然后以某种基于约定的方式绑定它们 从公开[open]通用服务的程序集公开NinjectModule,该程序集执行上述绑定,然后执行内核加载[prob by the DLL name pattern]。
听起来你没有做错什么,也没有疯,但我不清楚你想要什么。开放泛型类不能实例化,但您可以这样做。你能澄清什么是TParameter吗?你是如何指定你想要的类型的,加入更多的异常也无妨。@RubenBartelink我确实改进了这个问题,并给出了一个更具体的例子。我希望这能回答您的问题。您是否有一个从ICommandHandler派生并因此实现的类,因为消息说您没有?它是公共的吗?是否需要具有该类型的开放泛型?通常,人们有一个级别的开放泛型-ICommandHandler,然后有一个具体的类来实现它。不幸的是,我现在更困惑了,但希望其他人能看到你在想什么do@RubenBartelink,我确实简化了问题,谢谢你的帮助。我删除了多余的解释。@Adam:您是否对Ninject感兴趣,或者您介意我用如何使用Simple Injector来回答您的问题吗?您提到的前两行代码在编译时并没有显示错误消息“Type expected”,这就是我在示例中必须提供“float”和“int”的原因。@Adam Right,open泛型语法和.NET类型系统无法表示具有嵌套类型arg open的类型。您需要通过返回到具有开放参数的顶级类来解决这个问题。这里的底线是Jon Skeet C标记问题,而不是Ninject问题。更重要的是,您正在偏离常规-您的代码试图告诉您一些事情。。。泛型的两个轴很少像MI那样是个好主意……谢谢,但我不会说“偏离常规”,因为这是一个带有泛型命令的标准CQRS模式实现。但是,我同意你,两个级别的通用是C限制,C++模板有这个特性,所以它实际上是C限制而不是我的实现。@亚当,它是C++的,所以……对我来说不是一个简单的销售:约束是一种.NET约束,它与在可反射类型图中表示整个内容有关,实际上是一件好事。拥有命令处理程序和通用ICommandHandler是正常的CQR。拥有标准命令和非标准命令,能够请求ICommandHandler或ICommandHandler@Adam底线是,在.NET中,这些东西是在lang/compiler级别上解决的,并且不能表示为类型,所以.NET不会这样做b F会玩游戏,给你很好的类型推断c c c不会做这个级别的类型静态推理。但是,在您能够真正解释处理程序是泛型的基本需求之前,以上这些都不重要。人们不会这么做,你应该找到一种你也不必这么做的方式。