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自行推送?
这似乎是一种相当普遍的模式,并且想知道如果不编写自己的实现就可以实现这一点.
由于两个问题,你的绑定完全没有做任何事情:
IsAssignableFrom期望参数的顺序相反.你指定了
SomeCommand x = new ICommand<>();
Run Code Online (Sandbox Code Playgroud)封闭的泛型类不能分配给开放的泛型类型.或者换句话说
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)