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

时间:2011-10-19 05:06:46

标签: c# dependency-injection ninject

我正在尝试使用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);
}

3 个答案:

答案 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()))

当然,此解决方案的实用程度取决于您构建视图的方式。