Страницы

Поиск по вопросам

понедельник, 27 мая 2019 г.

C# MVVM (WPF). как использовать Model?

Здравствуйте, попрошу помочь с пониманием использования 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.
Да, это может быть некоторым дубляжом кода. Вот тут немного больше по этой же теме.

Комментариев нет:

Отправить комментарий