Ninject - 注册接口的所有实现

时间:2018-01-07 14:24:17

标签: c# dependency-injection inversion-of-control ninject

伙计我需要我认为是常见的情况,但似乎无法使其发挥作用。我想注册所有实现,以便Ninject在构造函数中检索它们:

public Handler(IEnumerable<IValidation> validations)
{
    // NationalIdValidation, PassportValidation, etc. are available here
}

当前注册我没有创建一些绑定但是从代码中查询验证检索没有记录:

Kernel.Bind(scan => scan.FromAssemblyContaining<IValidation>()
                .SelectAllClasses()
                .InheritedFrom<IValidation>()
                .BindAllInterfaces());

1 个答案:

答案 0 :(得分:1)

常见错误:

1)这些类实际上并不在约定所涵盖的程序集中

2)实现IValidation接口的类需要公开,您需要将IncludingNonPublicTypes()添加到约定中:

Kernel.Bind(scan => scan.FromAssemblyContaining<IValidation>()
            .SelectAllClasses()
            .IncludingNonPublicTypes()
            .InheritedFrom<IValidation>()
            .BindAllInterfaces());

另请注意,在Ninject的旧版本中,此方法称为IncludeNonePublicTypes()(无,而非非)。

出于调试目的,您还可以实现IBindingGenerator并更改绑定以使用它。然后在IBindingGenerator内设置一个断点,以查看实际找到的条件匹配的类。如果找到了必要的类,那么它只能是实现的Bind...部分的问题。