伙计们,我需要我认为常见的场景,但似乎无法使其发挥作用。我想注册所有实现,以便 Ninject 在构造函数中检索它们:
public Handler(IEnumerable<IValidation> validations)
{
// NationalIdValidation, PassportValidation, etc. are available here
}
当前注册我没有创建一些绑定(bind),但从上面的代码查询验证没有检索到任何记录:
Kernel.Bind(scan => scan.FromAssemblyContaining<IValidation>()
.SelectAllClasses()
.InheritedFrom<IValidation>()
.BindAllInterfaces());
最佳答案
常见错误:
1) 这些类实际上并不位于约定所涵盖的程序集中
2) 实现 IValidation
接口(interface)的类必须是公共(public)的或者,您需要将 InclusionNonPublicTypes()
添加到约定中: p>
Kernel.Bind(scan => scan.FromAssemblyContaining<IValidation>()
.SelectAllClasses()
.IncludingNonPublicTypes()
.InheritedFrom<IValidation>()
.BindAllInterfaces());
另请注意,在旧版本的 Ninject 中,此方法称为 IncludeNonePublicTypes()
(None 而不是 Non)。
出于调试目的,您还可以实现 IBindingGenerator
并更改您的绑定(bind)以使用它。然后在 IBindingGenerator 中设置断点来查看实际找到了哪些符合条件的类。如果找到了必要的类,那么它只能是实现的Bind...
部分的问题。
关于c# - Ninject - 注册接口(interface)的所有实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48138078/