Действительно ли Внедрение зависимости возможно с приложением WPF?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
35
задан Cœur 7 August 2017 в 16:34
поделиться

6 ответов

На самом деле очень легко сделать. У нас есть примеры этого в Призме как jedidja упомянутый. Вы можете или сделать, чтобы ViewModel был введен с Представлением или Представлением, введены с ViewModel. В Призме StockTraderRI Вы будете видеть, что мы вводим Представление в ViewModel. По существу то, что происходит, - то, что Представление (и интерфейс View) имеет свойство Model. То свойство реализовано в codebehind для установки DataContext на значение, например: this.DataContext = value;. В конструкторе ViewModel введено Представление. Это тогда устанавливает View.Model = this;, который передаст себя как DataContext.

можно также легко сделать реверс и вводить ViewModel в Представление. Я на самом деле предпочитаю это, потому что это означает, что ViewModel больше не имеет обратной ссылки на представление вообще. Это означает, когда поблочное тестирование ViewModel у Вас нет представления для ровной Насмешки. Дополнительно это делает инструмент для очистки кода в этом в конструкторе Представления, это просто устанавливает DataContext на ViewModel, который был введен.

я говорю немного больше об этом в видеозаписи Разделенного разговора о Шаблонах Представления, что Jeremy Miller и я дали в Kaizenconf. Первая часть которого может быть найдена здесь http://www.vimeo.com/2189854 .

Hope это помогает, Glenn

16
ответ дан sduplooy 27 November 2019 в 15:41
поделиться

Я думаю, что Вы совершили нападки по проблеме. Средства управления должны быть введены в их родителя, а не созданы декларативно через XAML.

Для DI для работы контейнер DI должен создать класс, который принимает зависимости. Это означает, что родитель не будет иметь никаких экземпляров дочерних элементов управления во время проектирования и посмотрит что-то как оболочка в разработчике. Это , вероятно рекомендуемый подход.

другая "альтернатива" должна иметь глобальный статический контейнер, названный от конструктора управления или чего-то подобного. Существует общий шаблон, в котором два конструктора объявляются, один со списком параметров для инжекции конструктора и другого без параметров, который делегирует:

// For WPF
public Foo() : this(Global.Container.Resolve<IBar>()) {}

// For the rest of the world
public Foo(IBar bar) { .. }

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

я даже не половина эксперта в WPF, таким образом, я ожидаю здоровое обслуживание downmod здесь:), но надежда это помогает. Группа Autofac (связанный от домашней страницы) могла бы быть другим местом для задавания этого вопроса. Призма или демонстрационные приложения MEF (которые включают некоторые примеры WPF) должны дать Вам общее представление о том, что возможно.

8
ответ дан user30493 27 November 2019 в 15:41
поделиться

Необходимо смотреть на Призму от p& p команда. Вот сайт на Codeplex

5
ответ дан Jedidja 27 November 2019 в 15:41
поделиться

Необходимо смотреть на Меч - это - простая платформа WPF/Silverlight MVC с поддержкой полного DI. Это выглядит действительно прохладным, и это позволяет Вам использовать любой контейнер МОК, который Вы хотите. Существует несколько примеров на документация wiki

3
ответ дан mookid8000 27 November 2019 в 15:41
поделиться

Humm, Мы испытываем подобную проблему, мы ожидаем к решению, которое обеспечит Поддержку режима разработки под Смешением Выражения 2.0 (Сильный Тип). Плюс мы ожидаем к решению иметь некоторых Mock+Auto-Generated образец данных, доступный под Смешением Выражения.

, Конечно, мы смотрим также для имения весь тех вещь работа с помощью шаблона МОК.

Paul Stovell как интересная статья для запуска с: http://www.paulstovell.com/blog/wpf-dependency-injection-in-xaml

, Таким образом, я пробую пару вещи добавить более ценную поддержку режима разработки Привязки и насмешки объекта во Время проектирования, прямо сейчас I’m, имеющий большую часть моей проблемы, связанной для получения сильной введенной связи, установленной между Представлением (код) к ModelView (Xaml), я попробовал пару сценария:

1.) Решение 1: Используя Универсальный для создания Представления

public class MyDotNetcomponent&lt;T&gt; : SomeDotNetcomponent
{
    // Inversion of Control Loader…
    // Next step add the Inversion of control manager plus
    // some MockObject feature to work under design time
    public T View {Get;}
}

не работает Это решение, так как Смешение не поддерживает Универсальный, внутри поверхность для дизайна, но Xaml действительно имеют некоторых, хорошо работают во времени выполнения, но не при дизайне;

2.) Решение 2: ObjectDataProvider

<ObjectDataProvider ObjectType="{x:Type CP:IFooView}" />
<!-- Work in Blend -->
<!—- IOC Issue: we need to use a concrete type and/or static Method there no way to achive a load on demande feature in a easy way -->

3.) Решение 3: Наследуйте ObjectDataProvider

<CWD:ServiceObjectDataProvider ObjectType="{x:Type CP:IFooView}" />
<!-- Cannot inherit from ObjectDataProvider to achive the right behavior everything is private-->

4.) Решение 4: Создайте ложный ObjectDataProvider с нуля к заданию

<CWD:ServiceObjectDataProvider ObjectType="{x:Type CP:IFooView }" />
<!-- Not working in Blend, quite obvious-->

5.) Решение 5: Создайте Расширение Разметки (Paul Stovell)

<CWM:ServiceMarkup MetaView="{x:Type CP:IFooView}"/>
<!-- Not working in Blend -->

Только для очистки одной точки, когда я сказал “not, работающий в blend”, я подразумеваю, что Обязательное диалоговое окно не применимо, и разработчик должен написать от руки XAML отдельно.

Наш следующий шаг должен будет, вероятно, занять время для оценки способности создать плагин для Смешения Выражения.

3
ответ дан Jordan S. Jones 27 November 2019 в 15:41
поделиться

Да, мы делаем все это время. Можно "ввести" ViewModel в DataContext управления.

я на самом деле нахожу WPF быть еще легче использовать с DI. Даже объекты зависимости и свойства работают с ним беспрепятственно.

2
ответ дан Justin Bozonier 27 November 2019 в 15:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: