Инъекция Ninject-конструктора в WPF - PullRequest
14 голосов
/ 06 февраля 2012

Можно ли использовать ninject для внедрения зависимостей таким образом, чтобы результатом было что-то вроде внедрения, которое я могу получить в MVC.Чтобы уточнить, если я использую адаптер Njectject MVC, я могу объявить, что мои веб-контроллеры имеют параметры конструктора, которые затем будут автоматически вставлены в Nineject.позволил бы мне иметь окно, такое как это:

public partial class MainWindow : Window
{
    private readonly IService injectedService;
    public MainWindow(IService injectedService) 
    {
        this.injectedService = injectedService;
    }
}

Я хотел бы сделать это без явного использования IKernel при запуске моего основного приложения для получения экземпляра mainwindow.Я бы предпочел использовать обычный метод конфигурации xaml для получения экземпляра главного окна и всех последующих окон.

Возможно ли это?Есть ли способ подключиться к созданию объекта, сгенерированному xaml, чтобы изменить его, чтобы использовать Ninject для внедрения зависимостей в конструктор.

1 Ответ

17 голосов
/ 08 февраля 2012

Судя по комментариям и вашей путанице, MVVM подходит вам. Задача состоит в том, чтобы научиться MVVM.

Итак, откройте хорошую ссылку и приступайте. MVVM на удивление легко сделать, и довольно легко обернуть все это с помощью Ninject и надеть на него лук.

Начальная кривая обучения, если вы НЕ используете стороннюю библиотеку для Ninject + MVVM, как я, немного крута. Вот пара вещей, которые я должен был понять:

        DataContext="{Binding Path=ResultViewModel,Source={StaticResource ServiceLocator}}"

Это небольшое добавление позволяет вам запускать целое число, чтобы получить информацию о модели представления из вашего XAML:

<Application.Resources>
    <ioc:NinjectServiceLocator x:Key="ServiceLocator" />
</Application.Resources>

этот маленький трюк позволяет назначить этот статический ресурс из файла app.xaml соответствующему классу

public class NinjectServiceLocator
{
    private readonly IKernel kernel;

    public NinjectServiceLocator()
    {
        kernel = new StandardKernel(new MyMvvmModule());
    }

    public ResultViewModel ResultViewModel
    {
        get { return kernel.Get<ResultViewModel>(); }
    }
}

Это примечательно. Каждая модель представления должна быть указана как свойство в ServiceLocator, чтобы Ninject мог сгенерировать их. Наконец, MyMvvmModule в приведенном выше примере является стандартным классом Ninject, в котором вы прикрепляете переопределение для Load () и связываете все свои интерфейсы.

...