C# Ninject-注册接口的所有实现

C# Ninject-注册接口的所有实现,c#,dependency-injection,inversion-of-control,ninject,C#,Dependency Injection,Inversion Of Control,Ninject,伙计们,我需要一个我认为是常见的场景,但似乎无法让它工作。我想注册所有实现,以便Ninject在构造函数中检索它们: public Handler(IEnumerable<IValidation> validations) { // NationalIdValidation, PassportValidation, etc. are available here } 公共处理程序(IEnumerable验证) { //此处提供国家验证、护照验证等 } 当前注册,我没有创建

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

public Handler(IEnumerable<IValidation> validations)
{
    // NationalIdValidation, PassportValidation, etc. are available here
}
公共处理程序(IEnumerable验证)
{
//此处提供国家验证、护照验证等
}
当前注册,我没有创建一些绑定,但从上面的代码查询验证不会检索任何记录:

Kernel.Bind(scan => scan.FromAssemblyContaining<IValidation>()
                .SelectAllClasses()
                .InheritedFrom<IValidation>()
                .BindAllInterfaces());
Kernel.Bind(scan=>scan.fromsassemblycontaining()
.SelectAllClasses()
.继承自()
.BindAllInterfaces());
常见错误:

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

2) 实现
IValidation
接口的类需要是公共的,或者您需要将
包括非公共类型()
添加到约定中:

Kernel.Bind(scan => scan.FromAssemblyContaining<IValidation>()
            .SelectAllClasses()
            .IncludingNonPublicTypes()
            .InheritedFrom<IValidation>()
            .BindAllInterfaces());
Kernel.Bind(scan=>scan.fromsassemblycontaining()
.SelectAllClasses()
.包括非公开类型()
.继承自()
.BindAllInterfaces());
还要注意,在旧版本的Ninject中,此方法被称为
IncludeNonePublicTypes()
(无而非非非)


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

最初的一瞥显示了不同的接口
IValidation
vs
IUserValidation
你是对的。我纠正了它,这是问题中的一个错误,而不是实际的问题。你确定你的Bind()调用实际上绑定了任何东西吗?您的所有实现都在同一个程序集中吗?您在那里使用什么样的扩展?默认情况下,Ninject没有采用lambda表达式的Bind()重载。这与预期一样有效。你应该发布整个例子!