绑定Ninject 3.0中的泛型类型

时间:2012-07-28 15:51:27

标签: c# .net generics ninject ioc-container

我希望Ninject为实现通用接口的特定程序集中的所有类型创建Bindings,而不在运行时全部指定它们。有点像开放式泛型如何在Autofac中工作。

这就是我想出来的......

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);
    }
}

是否有现成的方法来实现这一目标?或者我是否需要使用convention API自行推送?

这似乎是一种相当常见的模式,并且想知道如果不编写我自己的实现就可以实现这一点。

1 个答案:

答案 0 :(得分:6)

由于两个问题,你的绑定完全没有做任何事情:

  1. IsAssignableFrom期望参数顺序相反。你指定了

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

    ICommand<> x = new SomeCommand(); 
    

    无效代码。

  3. 你想要的是:

    kernel.Bind(x => x.FromThisAssembly()
                      .SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>))
                      .BindAllInterfaces());