我希望 Ninject 为实现通用接口(interface)的特定程序集中的所有类型创建绑定(bind),而不是在运行时指定它们。有点像开放泛型在 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 自己推出?
这似乎是一种相当常见的模式,我想知道是否可以在不编写自己的实现的情况下实现这一点。
最佳答案
由于两个问题,您的绑定(bind)完全没有执行任何操作:
IsAssignableFrom 需要相反顺序的参数。你指定
SomeCommand x = new ICommand<>();
封闭泛型类不能分配给开放泛型类型。或者换句话说
ICommand<> x = new SomeCommand();
不是有效代码。
你想要的是:
kernel.Bind(x => x.FromThisAssembly()
.SelectAllClasses().InheritedFrom(typeof(ICommandHandler<>))
.BindAllInterfaces());
关于c# - 在 Ninject 3.0 中绑定(bind)泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11702477/