在Ninject 3.0绑定泛型类型(Binding Generic Types in Ninjec

2019-09-20 09:00发布

我想Ninject创建绑定实现一个通用接口特定组件内的所有类型,而无需在运行指定他们。 有点像泛型如何在开放的工作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);
    }
}

有一个现有的方式来实现这一目标? 或者我需要使用的约定API推出自己的?

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

Answer 1:

你的绑定在做,因为两个问题究竟什么:

  1. IsAssignableFrom预计以相反的顺序的参数。 您指定

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

     ICommand<> x = new SomeCommand(); 

    是不是有效的代码。

你想要的是:

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


文章来源: Binding Generic Types in Ninject 3.0