我有创建层次结构的类,如下所示:
public interface IHandler<T, T2> {
}
public class BaseHandler : IHandler<T, T2> {
}
public class DerivedHandler : BaseHandler {
}
基本上,我们的想法是可以堆叠功能(每个派生级别都会附加更多功能)。
我正在尝试使用Ninject Conventions Extensions以一种很好的方式绑定它。我有这个:
kernel.Bind(
x =>
x.FromAssemblyContaining(typeof(IHandler<,>))
.SelectAllClasses()
.EndingWith("Handler")
.BindAllInterfaces());
当我请求DerivedHandler
时,这完美无缺。 Ninject根本没有抱怨。但是,当我请求BaseHandler
时,我会看到:
可以使用多个匹配的绑定。
显然,约定扩展是对继承的考虑。当我申请BaseHandler
时,它应该给我BaseHandler
还是DerivedHandler
? (我想要BaseHandler
..)。
有没有办法避免这种情况?我尝试了各种流利语法的组合,我可以得到“多个绑定”错误..或“找不到绑定”错误。
请注意,如果我手动绑定每个,这可以很好地工作。我认为证明Ninject处理这个没有问题..它只是公约。
答案 0 :(得分:2)
在您的示例中,您正在请求要实例化的具体(类)类型。
您需要在约定中使用.BindAllInterfaces()
,而不是绑定.BindToSelf()
。
但是,如果您不需要再进一步配置绑定(例如.InSingletonScope()或.OnActivation()...),您也可以省略绑定,因为每当您请求类类型时未绑定,ninject将尝试实例化所请求的类型。
完整示例:
kernel.Bind(x => x
.FromAssemblyContaining(typeof(IHandler<,>))
.SelectAllClasses()
.EndingWith("Handler")
.BindToSelf());