我正在尝试使用Ninject将IEnumerable
注入构造函数。
我的构造函数如下所示:
public MatrixViewModel(IEnumerable<FooViewModel> fooViewModels)
{
_fooViewModels = fooViewModels;
}
My Ninject模块如下所示:
public class MainModule : NinjectModule
{
public override void Load()
{
Bind<IEnumerable<FooViewModel>>()
.ToMethod(context => GetFooViewModels())
.InSingletonScope(); // this binding is not working
}
private IEnumerable<FooViewModel> GetFooViewModels()
{
// returns a bunch of foo view models
}
}
这似乎不起作用。我没有得到任何错误。 Ninject只是不使用绑定,传递给构造函数的值基本上只是一个空的默认值。
如何使用Ninject注入IEnumerable
?
修改
有关我工厂方法的更多详情:
private IEnumerable<FooViewModel> 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<FooViewModel>().ToConstant(fooViewModel);
}
答案 0 :(得分:15)
Ninject对可枚举的处理方式不同。只需为所有视图模型提供绑定。对于枚举,Ninject将创建每个应用绑定的实例,并将它们作为IEnumerable
传递。
e.g。
Bind<FooViewModel>().To<FooViewModel1>();
Bind<FooViewModel>().To<FooViewModel2>();
答案 1 :(得分:5)
根据Remo的回答,一种可能的解决方案是使用foreach
循环一次绑定一个视图模型:
foreach (var fooViewModel in GetFooViewModels())
{
Bind<FooViewModel>().ToConstant(fooViewModel);
}
答案 2 :(得分:3)
从你的问题:
Bind<IEnumerable<FooViewModel>>()
.ToMethod(context => GetFooViewModels())
我不确定收藏支持或ToMethod的工作方式。
这应该会起作用:
Bind<MatrixViewModel>()
.ToMethod(context => new MatrixViewModel(GetFooViewModels()))
当然,此解决方案的实用程度取决于您构建视图的方式。