Как добавить параметры в Ninject к разрешенной зависимости? - PullRequest
0 голосов
/ 23 мая 2018

Я создаю приложение WPF, используя модель MVVM.В рамках программы я создаю UserControl, который содержит ItemsControl из UserControls с их собственными связанными моделями представления.

Код выглядит следующим образом:

List<IDataViewModel> viewModels = new List<IDataViewModel>();

foreach (var type in Enum.GetValues(typeof(DataModel)))
{
    var tempVM = ViewModelLocator.Get<IDataViewModel>();
    tempVM.Type = type;
    viewModels.Add(tempVM);
}

IsЕсть ли способ сократить это или передать параметр как часть вызова .Get <>?

Edit

Я ушел, чтобы посмотреть на фабричный шаблонкак предложено в ответах и ​​обновили мой код следующим образом:

Factory, Ninject-Module

public interface IViewModelFactory
{
    IDataViewModel CreateDataViewModel(DataType type);
}

public class ViewModelModule : NinjectModule
{
    public override void Load()
    {
        Bind<IDataViewModel>().To<DataViewModel>();
        Bind<IViewModelFactory>().ToFactory();
    }
}

И приведенный выше код становится;

foreach (var type in Enum.GetValues(typeof(DataModel)))
{
    viewModels.Add(viewModelFactory.CreateDataViewModel(type));
}

Первыйвызов Factory, кажется, работает эффективно и создает новый ViewModel, однако последовательные вызовы не выполняются (то есть, кажется, не создают новый ViewModels), есть что-то, что я пропускаю?Я не мог найти много онлайн и что там есть, не ясно сформулировано и содержит грамматические ошибки.Страница, на которой я получил больше всего, ничего не говорит о том, почему это происходит.Нужно ли иметь на своей фабрике несколько IDataViewModels?Примерно так:

public interface IViewModelFactory
{
    IDataViewModel CreateDataViewModel1(AccountType type);
    IDataViewModel CreateDataViewModel2(AccountType type);
    IDataViewModel CreateDataViewModel3(AccountType type);
    IDataViewModel CreateDataViewModel4(AccountType type);
}

Второе редактирование

Убедитесь, что при добавлении переменной в Factory Interface CreateDataViewModel(var Variable) вы отражаете это изменениев вашем актуальном виде модель конструкторов подпись!Глупая ошибка с моей стороны!

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете передать параметры с помощью инжектора конструктора следующим образом:

var typeParam = new ConstructorArgument("type", type);
ViewModelLocator.Get<IDataViewModel>(typeParam);

Но вместо использования статического сервисного локатора я бы рекомендовал использовать строго типизированную фабрику, а затем снова внедрить эту фабрику с помощью инжектора конструктора.

https://github.com/ninject/Ninject.Extensions.Factory/wiki

...