2012-07-28 112 views
2

我希望Ninject为实现通用接口的特定程序集内的所有类型创建绑定,而无需在运行时将它们全部指定。有点像Autofac中开放泛型的工作原理。在Ninject 3.0中绑定泛型类型

这就是我想出了...

kernel.Bind(x => x.FromThisAssembly() 
    .SelectAllClasses() 
    .Where(t => t.IsAssignableFrom(
     typeof(ICommandHandler<>))) 
     .BindAllInterfaces()); 

调用下面的方法,我希望实现ICommandHandler<T>所有类型的数组,但它产生什么...

public void Process<TCommand>(TCommand command) 
    where TCommand : ICommand 
{ 
    var handlers = 
     _kernel.GetAll<ICommandHandler<TCommand>>(); 

    foreach(var handler in handlers) 
    { 
     handler.Handle(command); 
    } 
} 

有没有现成的方法来实现这一点?或者我是否需要使用惯例API推出自己的产品?

这似乎是一个相当普遍的模式,并想知道如果这可以实现而不写我自己的实现。

回答

6

你结合做,因为两个问题究竟什么:

  1. IsAssignableFrom希望以相反的顺序参数。您指定

    SomeCommand x = new ICommand<>(); 
    
  2. 封闭泛型类不可分配给开放泛型类型。换句话说,

    ICommand<> x = new SomeCommand(); 
    

    是无效的代码。

你想要的是:

kernel.Bind(x => x.FromThisAssembly() 
        .SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>)) 
        .BindAllInterfaces()); 
的包围
+0

轻微错字,应该是 - kernel.Bind(X => x.FromThisAssembly() .SelectAllClasses()InheritedFrom(typeof运算(ICommandHandler <>))BindAllInterfaces())。但是,嘿,我仍然感谢一下。谢谢 :) – Baldy 2012-07-30 08:53:29