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...
部分实现的问题。
伙计们,我需要一个我认为很常见但似乎无法实现的方案。我想注册所有实现,以便 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...
部分实现的问题。