Как я могу объединить MVVM и Dependency Injection в приложении WPF? - PullRequest
12 голосов
/ 26 ноября 2009

Не могли бы вы привести пример того, как бы вы использовали (ваш любимый) DI-фреймворк для связи MVVM View Models с приложением WPF?

Создаете ли вы сильно связанную иерархию моделей представления (например, когда ViewModel каждого вложенного элемента управления является свойством ViewModel родителя и вы связываете его с DataContext вложенного элемента управления в XAML), или вы использовали бы еще более-более abstract "" View Model "Manager", который поддерживает некоторую слабосвязанную иерархию ... как в CAB, может быть?

Ответы [ 3 ]

6 голосов
/ 26 ноября 2009

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

С точки зрения использования DI с MVVM, вы можете комбинировать оба. Это так просто, как:

public class MyViewModel
{
    private readonly IMyDependency _myDependency;

    public MyViewModel(IMyDependency myDependency)
    {
        _myDependency = myDependency;
    }
}

Обратите внимание, однако, что это предполагает подход «сначала посмотреть модель» к MVVM, который имеет свои недостатки.

3 голосов
/ 26 ноября 2009

В WPF это обычно довольно просто и не зависит от конкретного DI-контейнера. Вы читали статью Джоша Смита о MVVM ? Это в значительной степени описывает, как настроить иерархию ViewModels.

Чего не стоит, так это того, как создавать эти ViewModel из зависимостей (таких как хранилища), но это не сложная экстраполяция.

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

Вы можете использовать DI Бедного или любой Контейнер DI для подключения таких Фабрик для вас.

1 голос
/ 05 декабря 2009

Я опубликовал эту статью в Code Project о том, как создать расширяемое приложение WPF, используя MVVM и MEF для расширяемости. Однако, если вы посмотрите внимательно, я использовал MEF и для DI.

Приложение полностью MVVM и использует только DataTemplates (и случайное окно) для Views, как в статье Джоша Смита. WPF позаботится о применении правильного View для правильной ViewModel для вас. Это сладко.

Он использует MEF, чтобы части могли «найти» друг друга. Таким образом, ViewModel для элемента меню «View» находит все элементы меню, которые должны находиться в подменю, используя точки расширения, и ViewModel для каждой из этих «находок» ViewModel, которые они должны передать менеджеру макета, используя композиционные очки. Они также «находят» службу диспетчера макетов, используя элементарный локатор служб (MEF). Пример меню View - это почти то, о чем вы говорите с вложенными моделями представления. Круто то, что они даже не знают друг о друге до времени выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...