绑定Ninject 3.0中的泛型类型

Bal*_*ldy 2 .net c# generics ninject ioc-container

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

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

kernel.Bind(x => x.FromThisAssembly()
    .SelectAllClasses()
    .Where(t => t.IsAssignableFrom(
        typeof(ICommandHandler<>)))
        .BindAllInterfaces());
Run Code Online (Sandbox Code Playgroud)

调用下面的方法,我希望实现所有类型的数组,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Rem*_*oor 6

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

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

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

    ICommand<> x = new SomeCommand(); 
    
    Run Code Online (Sandbox Code Playgroud)

    是无效的代码.

你想要的是:

kernel.Bind(x => x.FromThisAssembly()
                  .SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>))
                  .BindAllInterfaces());
Run Code Online (Sandbox Code Playgroud)