#c_sharp #wpf #mvvm
Здравствуйте, попрошу помочь с пониманием использования MVVM патерна.
Как представляю я его для себя:
Существует отдельный самодостаточный проект (или библиотека) в котором написан какой
- то готовый функционал. Пользователю проекта предоставляется интерфейс в котором открыты
свойства который определяют состояние сервиса и открыты события для оповещения сервисом
(push/pull notification). Например для нотификации использовать ReactiveExt.
Стоит задача использовать этот сервис, написать для него UI.
Создаем новый WPF проект, для облегчения поддержки MVVM используем какой-нибудь фреймворк
(я использую Caliburn.Micro).
Создаем связку View-ViewModel. Используем Binding, code behind стараемся не использовать
(используем только для функционала замкнутого на View).
Отлаживаем отдельно UI-ый проект. Проверяем работу всех нотификаций, байндинга и т.д.
Имеем 2 готовых не связанных проекта. Сервис и UI.
Дальше... Самое простое получить экземпляр сервиса во ViewModel ( создать напрямую,
передать в конструкторе, получить через DI). И подписать обработчики события на события
сервиса. В теле обработчиков использовать свойства ViewModel которые участвуют в байндинге.
Также ViewModel обращается за состоянием сервиса к открытым свойствам сервиса. Таким
образом работа сервиса будет связанна с UI.
А где Model в этой структуре?
Если сделать Mapping сервиса на объект Model. Т.е. копия сервиса имеющая только нужные
для UI свойства. И уже получать экземпляр модели во ViewModel.
Но ведь тогда придется дублировать и события (нотификацию).
Тут я немного запутался)))...
Подскажите где же Model???
Ответы
Ответ 1
Вы всё правильно описываете. Сервис — это и есть ваша модель. Если вы считаете, что у сервиса свойства, готовые для отображения в UI, это чаще всего не так. Например, модель живёт в непонятно каком потоке (а то и в нескольких, как ей удобно), а VM должна жить в UI-потоке. VM должна выставлять INotifyPropertyChanged, а ваша модель выставляет Rx. Ну и вам наверняка не нужны все свойства вашего сервиса, а некоторые, возможно, вы хотите объединить или преобразовать как вам больше подходит для UI. Да, это может быть некоторым дубляжом кода. Вот тут немного больше по этой же теме.
Комментариев нет:
Отправить комментарий