我希望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自行推送?
这似乎是一种相当常见的模式,并且想知道如果不编写我自己的实现就可以实现这一点。
答案 0 :(得分:6)
由于两个问题,你的绑定完全没有做任何事情:
IsAssignableFrom期望参数顺序相反。你指定了
SomeCommand x = new ICommand<>();
封闭的泛型类不能分配给开放的泛型类型。或者换句话说
ICommand<> x = new SomeCommand();
无效代码。
你想要的是:
kernel.Bind(x => x.FromThisAssembly()
.SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>))
.BindAllInterfaces());