Какие параметры я должен передать конструктору моего ViewModel? - PullRequest
5 голосов
/ 27 ноября 2011

Я довольно новичок в WPF / MVVM и пытаюсь понять этот паттерн.Я изучаю это приложение MVVM http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

Автор создал Customer класс, который хранится в папке Model и CustomerRepository класс, который хранится в DataAccess папке

CustomerRepository содержит методы, которые «делают вещи», например static List<Customer> LoadCustomers(string customerDataFile) Т.е. мы не можем сказать, что CustomerRepository - это чистый файл модели, это также своего рода служебный файл.

Из другой руки CustomerRepository storeважные данные readonly List<Customer> _customers; и мы знаем, что мы должны хранить такие данные в модели!

Ну, я бы сказал, что CustomerRepository - это смешивание вещей - это файл модели, в котором содержатся некоторые служебные методы.

Проблема в том, что экземпляр CustomerRepository передается в ViewModel public AllCustomersViewModel(CustomerRepository customerRepository).Теперь viewModel содержит то, чего не должно, в частности он может заставить CustomerRepository перезагружать вещи и т.д.файлы моделей все служебные классы и методы для манипулирования файлами моделей должны быть в других местах .

Я прав или нет? Можно ли передавать класс, который предлагает некоторые услуги по модели (можно перезагрузить / обновить модель и т. Д.), В ViewModel? Т.е. где должен быть так называемый service layer, нормально ли иметь его во ViewModel?

Ответы [ 3 ]

4 голосов
/ 27 ноября 2011

Вы ошибаетесь, полагая, что «ViewModel должен содержать только ссылки на файлы моделей».

ViewModel может ссылаться на все, что ему нужно, если это не представление.

Очень часто внедряются сервисы в ViewModel.

1 голос
/ 27 ноября 2011

AFAIK, существует два широких подхода к шаблону MVVM.

Первый, с которым вы, кажется, знакомы больше, включает 4 компонента: View, Model, ViewModel и Controller.Здесь ViewModel содержит только логику пользовательского интерфейса и предоставляет события Controller, который служит для синхронизации между ViewModel и Model.

Второй, который используется в статье, просто объединяет ViewModel и Controller в ViewModel.Кстати, Мартин Фаулер описывает этот случай: http://martinfowler.com/eaaDev/PresentationModel.html

Выбор зависит от личных предпочтений, на мой взгляд.

1 голос
/ 27 ноября 2011

Хороший вопрос.Я верю, что в большинстве приложений MVVM вы найдете то же самое.На самом деле ViewModel знает о связи со службами, репозиториями, напрямую или нет, напрямую зависит от дизайна приложения, так что это довольно хорошо.Более того, VM должна иметь возможность принудительно перезагружать данные и так далее, чтобы отражать запрошенные изменения пользовательского интерфейса.ViewModel отделен от View с помощью команд и привязок, предоставляя командам ViewModel возможность обрабатывать любую конкретную команду, а затем запрашивать / обновлять новые данные из служб, что угодно.

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