3

我使用.NET 4.5,Ninject 3 the binding by convention lib如下:Ninject绑定通过公约没有泛型类型的工作

kernel.Bind(x => x 
    .FromAssembliesMatching("assembly.dll") 
    .SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>)) 
    .BindAllInterfaces()); 

,这是正确的约束力的:

public class MyCommandHandler : ICommandHandler<MyCommand> 

没有按't bind:

public class MyGenericCommandHandler<T> : ICommandHandler<MyGenericCommand<T>> 

但是,pre vious结合的作品,如果我想补充的具体实施我的泛型类的单个绑定,如:

kernel.Bind(typeof(ICommandHandler<MyGenericCommand<float>>)) 
     .To(typeof(MyGenericCommandHandler<float>)) 
kernel.Bind(typeof(ICommandHandler<MyGenericCommand<int>>)) 
     .To(typeof(MyGenericCommandHandler<int>)) 

但是,增加每一个人泛型类型违背公约的目的,需要对每个可能的个别类型如float添加绑定,整型,字符串,等等

你知道如何修改公约或添加(配有一个完全不同的解决方案,甚至 )另外一个支持通用 版本我的命令吗?即支持两级仿制药。

+0

这听起来不像是你做错了什么或疯狂的事情,丁丁我不清楚你想要什么。一个开放的泛型类不能被实例化,但是你可以做[像这样的东西](http://stackoverflow.com/questions/11682495/ninject-and-binding-generics)。你能澄清一下'TParameter'是什么,你是如何指定你想要的'Type'的,并且放入更多的例外是没有害处的。 –

+0

@RubenBartelink我的确改善了这个问题,并给出了一个更具体的例子。我希望这回答了你的问题。 – Adam

+1

你有没有从[并因此实现] ICommandHandler >这个消息说你不?它是公开的吗?是必需的类型的开放通用?通常人们有一个开放的通用级别 - ICommandHandler <>'然后有一个实现类的具体类。不幸的是我现在更困惑,但希望别人能看到你想要做什么 –

回答

0

编辑:不编译[和事实它没有揭示的要求没有意义],请参阅评论中的结论推理。


这只是普通的开放式泛型情况。正如我在前面的评论的链接提到,顺便基本结合使该DRY看起来很简单:

kernel.Bind(typeof(ICommandHandler<MyGenericCommand<>>)) 
    .To(typeof(MyGenericCommandHandler<>)); 

此绑定,然后将足以满足任何T变种ICommandHandler<MyGenericCommand<T>>

在做基于约定的约束条件下映射你所期望的内容时,问题在于SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>))不包含泛型类 - 这很有意义,因为很少可以指定非具体类的泛化规则。

您可以

  • 使用DSL的一个不同的投影部来选择通用类,然后在一些约定基于方式结合它们
  • 暴露从组件一个NinjectModule暴露[开]通用服务,其执行上述Bind,然后执行模块[通过DLL名称模式的概率]的kernel.Load()
+0

您提到的前两个代码行不会编译错误消息'预期类型'这就是为什么我不得不在我的例子中提供'float'和'int'的原因。 – Adam

+0

@Adam正确的说,开放的通用语法(和.NET类型系统)没有办法表达一个* nested *类型arg open的类型。您需要通过回到仅具有开放参数的顶级类来解决此问题。这里的底线是你有一个Jon Skeet C#标签问题,而不是Ninject问题。更重要的是,你偏离了路径 - 你的代码试图告诉你一些东西......两个通用性轴很少是一个好主意(有点像MI ...) –

+0

谢谢,但我不会说'偏离路径',因为这是一个具有通用命令的标准CQRS模式实现。不过,我同意你的观点,即具有两个通用级别是C#限制,C++模板具有此功能,所以它实际上是C#限制,而不是我的实现。 – Adam