使用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()))
当然,此解决方案的有效性取决于您构建视图的方式。