Как объединить MVVM и Injection Dependency в приложении WPF?

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

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

Ответ 1

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

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

public class MyViewModel
{
    private readonly IMyDependency _myDependency;

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

Обратите внимание, однако, что это предполагает подход "взгляда первой модели" к MVVM, у которого есть свои недостатки.

Ответ 2

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

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

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

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

Ответ 3

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

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

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