Инъекционная инъекция конструктора в WPF

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

Тем не менее, я не нашел такое расширение ninject для WPF, которое позволило бы мне иметь такое окно:

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

этот небольшой трюк позволяет назначить этот staticresource из файла 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() и связываете все свои интерфейсы.