Страницы

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

пятница, 10 января 2020 г.

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

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

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

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