C# Ninject-注册接口的所有实现
伙计们,我需要一个我认为是常见的场景,但似乎无法让它工作。我想注册所有实现,以便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验证) { //此处提供国家验证、护照验证等 } 当前注册,我没有创建
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
vsIUserValidation
你是对的。我纠正了它,这是问题中的一个错误,而不是实际的问题。你确定你的Bind()调用实际上绑定了任何东西吗?您的所有实现都在同一个程序集中吗?您在那里使用什么样的扩展?默认情况下,Ninject没有采用lambda表达式的Bind()重载。这与预期一样有效。你应该发布整个例子!