Здравствуйте, попрошу помочь с пониманием использования 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???
Ответ
Вы всё правильно описываете. Сервис — это и есть ваша модель.
Если вы считаете, что у сервиса свойства, готовые для отображения в UI, это чаще всего не так. Например, модель живёт в непонятно каком потоке (а то и в нескольких, как ей удобно), а VM должна жить в UI-потоке. VM должна выставлять INotifyPropertyChanged, а ваша модель выставляет Rx. Ну и вам наверняка не нужны все свойства вашего сервиса, а некоторые, возможно, вы хотите объединить или преобразовать как вам больше подходит для UI.
Да, это может быть некоторым дубляжом кода. Вот тут немного больше по этой же теме.
Комментариев нет:
Отправить комментарий