使用Ninject工厂方法将IEnumerable注入构造函数

我正在尝试使用Ninject将IEnumerable注入构造函数中。

我的构造函数看起来像这样:

 public MatrixViewModel(IEnumerable fooViewModels) { _fooViewModels = fooViewModels; } 

我的Ninject模块如下所示:

 public class MainModule : NinjectModule { public override void Load() { Bind<IEnumerable>() .ToMethod(context => GetFooViewModels()) .InSingletonScope(); // this binding is not working } private IEnumerable GetFooViewModels() { // returns a bunch of foo view models } } 

这似乎不起作用。 我没有得到任何错误。 Ninject只是不使用绑定,传递给构造函数的值基本上只是一个空的默认值。

你如何使用Ninject注入IEnumerable

编辑

关于我工厂方法的更多细节:

 private IEnumerable GetFooViewModels() { return new[] { new FooViewModel { Bar = new BarViewModel { X = 1, Y = 2 }, Misc = "Hello" }, new FooViewModel { Bar = new BarViewModel { X = 3, Y = 4 }, Misc = "Goodbye" }, // etc..... }; } 

编辑2

基于Remo的答案,一种可能的解决方案是使用foreach循环一次绑定一个视图模型:

 foreach (var fooViewModel in GetFooViewModels()) { Bind().ToConstant(fooViewModel); } 

Ninject对可枚举的处理方式不同。 只需为所有视图模型提供绑定。 对于枚举,Ninject将创建每个应用绑定的实例,并将它们作为IEnumerable传递。

例如

 Bind().To(); Bind().To(); 

基于Remo的答案,一种可能的解决方案是使用foreach循环一次绑定一个视图模型:

 foreach (var fooViewModel in GetFooViewModels()) { Bind().ToConstant(fooViewModel); } 

从你的问题:

 Bind>() .ToMethod(context => GetFooViewModels()) 

我不确定集合支持或ToMethod是这样工作的。

这应该会工作:

 Bind() .ToMethod(context => new MatrixViewModel(GetFooViewModels())) 

当然,此解决方案的有效性取决于您构建视图的方式。