2

我希望 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 自行开发?

这似乎是一种相当普遍的模式,并且想知道是否可以在不编写我自己的实现的情况下实现这一点。

4

1 回答 1

6

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

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

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

    ICommand<> x = new SomeCommand(); 
    

    不是有效代码。

你想要的是:

kernel.Bind(x => x.FromThisAssembly()
                  .SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>))
                  .BindAllInterfaces());
于 2012-07-30T08:32:56.650 回答