Внедрение IEnumerable в конструктор с помощью фабричного метода Ninject - PullRequest
9 голосов
/ 19 октября 2011

Я пытаюсь вставить 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 просто никогда не использует привязку, и значение, которое передается в конструктор, в основном является пустым значением по умолчанию.

Как вы вводите IEnumerable с помощью Ninject?

Редактировать

Подробнее о моем заводском методе:

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

Исходя из ответа Ремо, одним из возможных решений является использование цикла foreach для привязки моделей представлений по одной:

foreach (var fooViewModel in GetFooViewModels())
{
    Bind<FooViewModel>().ToConstant(fooViewModel);
}

Ответы [ 3 ]

15 голосов
/ 19 октября 2011

Перечислители обрабатываются Ninject по-разному.Просто предоставьте привязки для всех моделей представлений.Для перечислимых объектов Ninject создаст экземпляр каждой применяемой привязки и передаст их как IEnumerable.

, например,

Bind<FooViewModel>().To<FooViewModel1>();
Bind<FooViewModel>().To<FooViewModel2>();
5 голосов
/ 21 октября 2011

Исходя из ответа Ремо, одним из возможных решений является использование цикла foreach для привязки моделей представления по одной:

foreach (var fooViewModel in GetFooViewModels())
{
    Bind<FooViewModel>().ToConstant(fooViewModel);
}
3 голосов
/ 21 октября 2011

Из вашего вопроса:

Bind<IEnumerable<FooViewModel>>()
    .ToMethod(context => GetFooViewModels())

Я не уверен, что поддержка сбора или ToMethod работает таким образом.

Это должно сработать, хотя:Конечно, насколько полезно это решение, зависит от того, как вы строите свои взгляды.

...