c# - Ninject - 注册接口(interface)的所有实现

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

伙计们,我需要我认为常见的场景,但似乎无法使其发挥作用。我想注册所有实现,以便 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/

相关文章:

c# - 如何在图像上写XAML控件?

oop - 依赖注入(inject)会增加我做傻事的风险吗?

design-patterns - 正确使用 IoC 容器如何帮助您避免使用工厂?

dependency-injection - 构造函数注入(inject)/依赖注入(inject) - 处理 'root' 类

c# - Miniprofiler 在缺少 CreatedOn 列时中断

c# - 否定空格、正斜杠和反斜杠的正则表达式

c# - 在使用属性注入(inject)时,我们如何知道 "Local Defaults"是什么?

android - Dagger 2 组件链依赖

asynchronous - 异步对象未向 get_it 注册

c# - MongoDb c# 驱动程序 2.0 BsonNull 用法