1

我有创建这样的层次结构的类:

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 一点也不抱怨。但是,当我请求 a 时BaseHandler,我会看到:

有多个匹配的绑定可用。

显然,约定扩展正在考虑继承。当我请求BaseHandler.. 它应该给我 aBaseHandler还是 a DerivedHandler?(我想要BaseHandler..)。

有没有办法避免这种情况?我尝试了各种流利语法的组合,我可以得到“多个绑定”错误..或“未找到绑定”错误。

请注意,如果我手动绑定每个,这将非常有效。我认为这证明 Ninject 处理这个没有问题。它只是约定。

4

1 回答 1

2

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

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

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

完整示例:

kernel.Bind(x => x
     .FromAssemblyContaining(typeof(IHandler<,>))
     .SelectAllClasses()
     .EndingWith("Handler")
     .BindToSelf());
于 2014-02-04T10:24:02.800 回答