考虑以下代码。
当我尝试运行程序时,出现了以下异常。
错误激活IFoo 没有匹配的绑定可用,并且该类型不是自绑定的。 激活路径: 2)将依赖项IFoo注入到类型Bar的构造函数参数foos中 1)请求Bar 我如何在Ninject中注入/绑定数组?
谢谢你的时间。
编辑: 我的应用程序导入由第三方组件创建的数据。 导入过程应用不同种类的过滤器(例如不同过滤器接口的实现)。 过滤规则经常更改,但使用纯配置(和主过滤器)进行操作过于复杂。
我希望使添加/编辑过滤器最简单。 我拥有一个包含所有过滤器实现的程序集。 我尝试将每个过滤器接口绑定到以下方法(该方法提供该过滤器类型的每个实现的实例)。 基本上,我想避免在添加/删除过滤器类时需要更改我的Ninject模块。
public interface IFoo { }
public class Bar
{
public Bar(IFoo[] foos) { }
}
public class MyModule : NinjectModule
{
public override void Load()
{
Bind<IFoo[]>().ToConstant(new IFoo[0]);
// ToConstant() is just an example
}
}
public class Program
{
private static void Main(string[] args)
{
var kernel = new StandardKernel(new MyModule());
var bar = kernel.Get<Bar>();
}
}
当我尝试运行程序时,出现了以下异常。
错误激活IFoo 没有匹配的绑定可用,并且该类型不是自绑定的。 激活路径: 2)将依赖项IFoo注入到类型Bar的构造函数参数foos中 1)请求Bar 我如何在Ninject中注入/绑定数组?
谢谢你的时间。
编辑: 我的应用程序导入由第三方组件创建的数据。 导入过程应用不同种类的过滤器(例如不同过滤器接口的实现)。 过滤规则经常更改,但使用纯配置(和主过滤器)进行操作过于复杂。
我希望使添加/编辑过滤器最简单。 我拥有一个包含所有过滤器实现的程序集。 我尝试将每个过滤器接口绑定到以下方法(该方法提供该过滤器类型的每个实现的实例)。 基本上,我想避免在添加/删除过滤器类时需要更改我的Ninject模块。
private IEnumerable<TInterface> GetInterfaceImplementations<TInterface>(IContext context)
{
return GetType().Assembly.GetTypes()
.Where(t => typeof (TInterface).IsAssignableFrom(t) && IsConcreteClass(t))
.Select(t => Kernel.Get(t)).Cast<TInterface>();
}
我在绕过容器的 DI 机制方面感到有些内疚。这是一种不好的做法吗?有没有常见的做法来解决这些问题?
解决方案:
像 bsnote 建议的那样,我使用了一个包装类。