使用一个Ninject工厂方法将IEnumerable注入构造函数
本文关键字:方法 工厂 IEnumerable 构造函数 注入 Ninject 一个 | 更新日期: 2023-09-27 18:11:43
我正在尝试将IEnumerable
注入到Ninject的构造函数中。
构造函数是这样的:
public MatrixViewModel(IEnumerable<FooViewModel> fooViewModels)
{
_fooViewModels = fooViewModels;
}
我的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);
}
enumerable被Ninject区别对待。只需为所有视图模型提供绑定。对于枚举对象,Ninject将创建每个应用绑定的实例,并将其作为IEnumerable
传递。
。
Bind<FooViewModel>().To<FooViewModel1>();
Bind<FooViewModel>().To<FooViewModel2>();
根据Remo的回答,一个可能的解决方案是使用foreach
循环一次绑定一个视图模型:
foreach (var fooViewModel in GetFooViewModels())
{
Bind<FooViewModel>().ToConstant(fooViewModel);
}
从你的问题:
Bind<IEnumerable<FooViewModel>>()
.ToMethod(context => GetFooViewModels())
我不确定集合支持或tommethod是这样工作的。
这应该可以工作:
Bind<MatrixViewModel>()
.ToMethod(context => new MatrixViewModel(GetFooViewModels()))
当然,这个解决方案有多有用取决于你如何构建你的视图