2015-04-25 2 views
3

Я делаю переход от MVP к MVVM и немного смущен относительно того, как наилучшим образом привязать ViewModel к Model. Я понимаю, как мы можем использовать данные WPF в обязывающих инфраструктуру для маршрутизации событий между View и ViewModel использованием ICommand и INotifyPropertyChanged интерфейс, например, View:Binding Model to ViewModel (WPF)

public class MyView 
{ 
    public MyView() 
    { 
     InitializeComponent(); 
     DataContext = new MyViewModel(); 
    } 
} 

и ViewModel:

public class MyViewModel : INotifyPropertyChanged 
{ 
    public MyViewModel(){} 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public ICommand MyCommand ... 
} 

Это прекрасно работает !

Сейчас, как правило, с MVP я должен был бы мой Presenter держать ссылку на Model через инъекцию конструкторы, а также повысить события на Model из Presenter для обновления данных в Model. Я пробовал такой же подход с MVVM, но для этого требуется ViewModel взять Model в качестве зависимости в его конструкторе, который, кажется, делает вещи немного грязными с MVVM при использовании его прямо из коробки без какой-либо формы IOC (с WPF как минимум).

Итак, мои два вопроса:

  1. ли инъекции Model в ViewModel правильный подход, или я должен реализует INotifyPropertyChanged интерфейс на Model и использования связывания инфраструктуры WPF в?
  2. Чтобы воспользоваться преимуществами MVVM, вы должны почти всегда реализовывать его с помощью IOC и контейнера DI или, еще лучше, Prism?
+0

Связанный вопрос: http://stackoverflow.com/questions/16947122/binding-to-model-or-viewmodel. –

+0

Связанный вопрос: http://stackoverflow.com/questions/16864610/mvvm-propertychanged-in-model-or-viewmodel –

+0

Связанный вопрос: http://stackoverflow.com/questions/772214/in-mvvm-should-the -viewmodel-or-model-implement-inotifypropertychanged –

ответ

4
  1. Это "чистый" MVVM подход: View должен зависеть только от ViewModel. Сам по себе ViewModel является мостом между View и Model.

    Мотивация - определение и обязанности Model, View и ViewModel, а также их отношения:

    • Модель, которая обеспечивает вид-независимое представление ваших коммерческих организаций. Конструкция модели оптимизирована для логических отношений и операций между вашими бизнес-объектами, независимо от того, как данные представлены в пользовательском интерфейсе.
    • Класс просмотра, который является пользовательским интерфейсом . Он отображает информацию пользователю и запускает события в ответ на взаимодействие с пользователем.
    • Класс ViewModel, который является мост между видом и моделью. Каждый класс View имеет соответствующий класс ViewModel. ViewModel извлекает данные из Модели и обрабатывает их в формате, требуемом View. Он уведомляет View, если базовые данные в модели изменены, и обновляет данные в Модели в ответ на события пользовательского интерфейса из представления.

    - Implementing the Model-View-ViewModel Pattern, MSDN.

    Заключение. Ввод Model в ViewModel представляется правильным подходом. Кроме того, вместо инъекций Model может быть полезно вводить:

    • Model Factory создать Model - ленивая инициализация;
    • Service (Service Facade) для получения Model - ленивая загрузка.
  2. Как показано в "MVVM Unleashed" book by Michael Brown, потенциальные выгоды на следующий MVVM могут быть использованы: ремонтопригодность, проверяемость, «Смешиваемость», портативность. По крайней мере, инъекции зависимостей (в описанном случае с использованием зависимостей инъекции контейнер) позволяет конструкцию, чтобы следовать Принцип инверсии зависимостей:

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

    - The Dependency Inversion Principle, Robert C. Martin, 1996.

    В результате такие преимущества MVVM, как ремонтопригодность и тестируемость, как представляется, улучшаются при соблюдении принципа инверсии зависимостей. Контейнер для инъекций - это просто инструмент, который следует за Принципом.