2012-02-06 2 views
14

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

Однако я не нашел такой Ninject расширения для WPF, который позволил бы мне иметь окно, такие как это:

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

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

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

+2

Я не думаю, что такое расширение существует, потому что в WPF вы обычно используете шаблон MVVM и таким образом вводите службы в свои классы ViewModel. –

+0

Но не сами модели, созданные с помощью XAML? По общему признанию, я не эксперт по WPF, но разве модели не нуждались бы в такой же инъекции зависимостей? Я обеспокоен тем, что мой контейнер показывает, что будет препятствовать единичному тестированию проекта. – Dervall

+3

Нет, ViewModels не создаются в XAML. Они создаются в ViewModelLocator, см. [Здесь] (http://windowsphonegeek.com/articles/Working-with-a-simple-ViewModelLocator-from-MVVM-Lite) для примера. Ваши представления или ViewModels ничего не знают о вашем контейнере для инъекций зависимостей. –

ответ

17

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

Итак, взломайте good link и получите рулон. 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() и связываете все свои интерфейсы.

+0

Спасибо, очень полезно – Dervall

+1

@ Dervall Спасибо. Этот любопытный пост - это то, что я думаю, что Джефф Этвуд предусмотрел для SO. У меня была аналогичная проблема, поэтому я поделился информацией, которую я узнал, исследуя ее в течение нескольких часов, сохраняя в будущем много времени, надеюсь. – deltree

Смежные вопросы