使用一个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);
}

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

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

当然,这个解决方案有多有用取决于你如何构建你的视图