Ninject - 注册接口的所有实现

Ninject - register all implementations of an interface

伙计们,我需要一个我认为很常见但似乎无法实现的方案。我想注册所有实现,以便 Ninject 在构造函数中检索它们:

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

我没有创建一些绑定的当前注册,但是从上面的代码查询 validations 没有检索到任何记录:

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

常见错误:

1) 类 实际上不在约定

涵盖的程序集中

2)实现IValidation接口的类需要public或者需要加上IncludingNonPublicTypes()惯例:

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

另请注意,在旧版本的 Ninject 中,此方法被称为 IncludeNonePublicTypes()(None 而不是 Non)。

出于调试目的,您还可以实施 IBindingGenerator 并更改您的绑定以使用它。然后在IBindingGenerator里面打个断点,看看实际找到了符合条件的类。如果找到需要的类,那么只能是Bind...部分实现的问题。