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

dev*_*xer 9 c# dependency-injection ninject

我正在尝试IEnumerable使用Ninject 注入构造函数.

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

public MatrixViewModel(IEnumerable<FooViewModel> fooViewModels)
{
    _fooViewModels = fooViewModels;
}
Run Code Online (Sandbox Code Playgroud)

我的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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

你如何注射IEnumerableNinject?

编辑

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

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.....
    };
}
Run Code Online (Sandbox Code Playgroud)

编辑2

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

foreach (var fooViewModel in GetFooViewModels())
{
    Bind<FooViewModel>().ToConstant(fooViewModel);
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*oor 15

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

例如

Bind<FooViewModel>().To<FooViewModel1>();
Bind<FooViewModel>().To<FooViewModel2>();
Run Code Online (Sandbox Code Playgroud)


dev*_*xer 5

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

foreach (var fooViewModel in GetFooViewModels())
{
    Bind<FooViewModel>().ToConstant(fooViewModel);
}
Run Code Online (Sandbox Code Playgroud)