使用Ninject Extensions继承避免多个绑定

时间:2014-02-04 09:18:28

标签: c# ninject ninject-conventions

我有创建层次结构的类,如下所示:

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处理这个没有问题..它只是公约。

1 个答案:

答案 0 :(得分:2)

在您的示例中,您正在请求要实例化的具体(类)类型。

您需要在约定中使用.BindAllInterfaces(),而不是绑定.BindToSelf()

但是,如果您不需要再进一步配置绑定(例如.InSingletonScope()或.OnActivation()...),您也可以省略绑定,因为每当您请求类类型时未绑定,ninject将尝试实例化所请求的类型。

完整示例:

kernel.Bind(x => x
     .FromAssemblyContaining(typeof(IHandler<,>))
     .SelectAllClasses()
     .EndingWith("Handler")
     .BindToSelf());