|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||||
WPF MVVM бизнес логика и Model02.11.2021, 00:10. Показов 16212. Ответов 132
Всем привет!
Я уже довольно долго пытаюсь разобраться что же представляет из себя архитектура MVVM, конкретно задачи View и ViewModel мне понятны. Но остается вопрос что из себя представляет Model? Много где есть определение Model = бизнес логика. Но как понять какую логику отнести к модели, а какую например к сервису. К сожалению толкового ответа я не нашел, может плохо гуглил. В уроках обычно банальные примеры с расселением студентов по комнатам, что редко отображает реальное использование программы. На YouTube смотрел уроки по созданию MVVM приложению от Павла Шмачилина(https://www.youtube.com/watch?... P4&t=3630s), но именно про архитектуру он рассказывает не настолько подробно как хотелось бы. Все что я понял это то что Model занимается некими правилами записи и получения данных из сервисов. Также предоставляет данные для ViewModel. Тоесть та самая бизнес логика (про нее я смотрел https://www.youtube.com/watch?v=9DW-xdwjop8) и преобразование данных. Но уверенности что я все понял как нужно, нет. Ниже приведены примеры с которыми я сталкивался, но понятного для меня решения не нашел.
0
|
||||
| 02.11.2021, 00:10 | |
|
Ответы с готовыми решениями:
132
Model в MVVM
|
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 02.11.2021, 22:51 [ТС] | ||
|
Добавлено через 10 минут А все, разобрался, почему-то отсутствовал языковой пакет
0
|
||
|
|
||||||
| 03.11.2021, 01:07 | ||||||
|
xr_Sanya, я вот так переношу данные из List<T> в ObservableCollection<T>. Еще тут используется многопоток, так как асинхронные методы у меня вызываются через менеджер потоков.
0
|
||||||
|
|
|
| 03.11.2021, 01:44 | |
|
xr_Sanya, Для View - тип проекта Приложение WPF, для всего остального - Библиотека классов WPF.
0
|
|
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|||
| 03.11.2021, 01:47 [ТС] | |||
|
Сейчас поправлю
0
|
|||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 03.11.2021, 16:38 [ТС] | ||
|
И создал отдельно модель которая должна работать с сервисом настроек приложения и предоставлять эти данные для View Мне не совсем понятно как это все реализовать, ведь View требуется ObservableCollection, а в сервисе настроек у нас лист. Каким образом модели отображать изменения и вносить их? Коммиты Нужные: f4641c1 cf488d8 9180d24
0
|
||
|
Модератор
|
||
| 03.11.2021, 18:35 | ||
|
Сделаем реализацию, а потом вы уже будете пытаться её модернизировать. Начнём реализацию с объявления интерфейса Модели. VM будет получать этот интерфейс и через него работать с данными. За одно этот интерфейс будет играть роль ТЗ на Модель, что поможет понять как должен разделяться функционал. Что нам нужно от Модели? 1) Получение списка мониторов - метод: IEnumerable<MonitorConfiguration> GetMonitors(). Здесь сразу нужно уточнить: Как точно идентифицируется монитор, по каким полям? 2) Состояние мониторов может меняться. Поэтому нужно событие извещающее об изменении состояния монитора; 3) Нужны ли какие-то методы по управлению мониторами? Если нужны, то добавить их в интерфейс. 4) В этот же интерфейс добавить все методы для работы с сервисами настроек и времени. Если у них есть интерфиксы, то просто добавить их в список базовых В результате мы получим некую морду Модели. VM будет работать только с ней. Как там дальше Модель работает с данными (через Сервисы, Репозитории, сама непосредственно) - для VM не интересно.
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 03.11.2021, 23:04 [ТС] | ||
|
Как мне кажется нужно в сервисе настроек это делать, а модель будет получать уведомление об изменении свойства,а ViewModel будет заново его запрашивать. Но если таких свойств очень много, то на изменение каждого нужно будет прописывать уведомление.
0
|
||
|
Модератор
|
||||
| 03.11.2021, 23:49 | ||||
|
В параметрах будет передавать источник события и новое состояние монитора. Если для логику нужно, то можно и третий параметр - старое состояние монитора. Как потом они будет реализоваться - это вторично. В первую очередь надо создать архитектуру приложения. И начинаем мы с самых крупных частеq - слоёв View, ViewModel, Model. Нам нужно задать "средство общения" между Model и ViewModel. Задав его мы определим архитектур на этом уровне и после этого уже можно будет приступать к более мелким задачам: как в деталях реализовывать эту архитектуру. Добавлено через 3 минуты Основная задача, как я понял - это наблюдение за мониторами. Состояние монитора отражается в типе MonitorConfiguration. На не нужно следить за каждым свойством MonitorConfiguration. У нас общее событие на изменение состояния MonitorConfiguration. Какие могут быть изменения у коллекции MonitorConfiguration? За чем вы там наблюдали?
0
|
||||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 04.11.2021, 04:44 [ТС] | ||
|
Добавлено через 2 минуты Тоесть я понимаю что нужно создать Event который будет передавать изменённые поля в MonitorsModel из SettingsService. Как тогда модель будет знать какие именно поля нужно обновить? Ведь мы передаем значения? Или передаем сразу новый экземпляр класса MonitorConfiguration с изменными полями? Добавлено через 4 часа 49 минут Создал отдельный проект, чисто для этой темы Репозиторий Сделал базовую структуру проекта, добавил нужные модели, прописал необходимые методы. Вопрос как связать данные модель с вью моделью остается. Конкретно MonitorsModel как связать с вью моделью чтобы она обновляла данные о мониторах. Ну и сами модели я тоже не уверен что должны быть такими.
0
|
||
|
Модератор
|
||||
| 04.11.2021, 08:24 | ||||
|
Чем занимается у нас Модель? Наблюдением и управлением Мониторами. Для управления Монитором у нас в Модели должна быть Бизнес сущность являющаяся отражением физического устройства. Бизнес Сущность должна быть инкапсулирована и взаимодействие с Моделью происходит посредством отражения этой Бизнес Сущности на тип не связанный с Бизнес Логикой. Вот ваш тип MonitorConfiguration - это и есть тип отражающий Бизнес Сущность Модели. Бизнес сущность у вас реализована в виде различных сервисов, то есть какого-то конкретного объекта отражающего физический монитор у вас нет. Мне, кажется, это крайне неудобным и запутанным. Но если вам удобны эти сервисы - то делайте так. Дальше. Изменилось состояние устройства. Это изменение отразилось на Бизнес Сущность Модели. Как конкретно это произошло, нас пока не интересует. Но Модели теперь надо как-то уведомить своих потребителей об изменении состояния. Сделать это можно только посредством события. Можно сделать событие, уведомляющее об изменении состояния устройства или уведомляющее об изменении какой-то его характеристики. В первом случае в событии сообщается какое устройство изменилось и, если надо, какие-то доп. параметры изменения. Такое событие реализуется на уровне Модели и в параметрах его передаётся DTO. Во втором случае нужно уже уведомлять об изменении определённых характеристик у определённого устройства. Следовательно событие это должно быть реализовано на уровне отражения устройства. В этом случае получение DTO отражающего Бизнес Сущность будет уже мало. Надо будет получать полноценные Модели для каждого устройства и подписываться на события каждой из них. Второй вариант имеет смысл, если устройство требует сложного управления, имеет множество характеристик и т.д, Этот вариант значительно сложнее, но когда такой сложный объект приходится прибегать к нему. В вашем случае, на мой взгляд, достаточно будет пойти по первому варианту. То есть Модель будет присылать DTO отражающий всё состояние Монитора. А какие в нём изменились данные будет уже определять потребитель. Свойств не так много и это не шибко сложно, тем более, что может одновременно измениться несколько характеристик. Можно так же о каких-то существенных изменениях сообщать через дополнительный параметр-действие в событии. Это типа: подключение нового монитора, отключение монитора и т.д. Добавлено через 19 минут Тип проекта "Библиотека классов WPF". В эту библиотеку перенесите классы команд и реализации INPC. Более детально. В библиотеке Common добавьте папку Модель. В ней будут классы используемые Моделью, но которые должны быть видны вне неё. В папку добавьте ваш DTO MonitorConfiguration. Он должен отражать ВСЕ требуемые вам характеристики монитора. Потом в папку добавляете интерфейс IMonitorsModel. В этом интерфейсе прописывает все члены необходимые для работы с мониторами. Как минимум метод возвращающий все мониторы, событие уведомляющее об изменении монитора. Если предусматривается управление мониторами, то методы для этого управления. Возможно метод получения состояния определённого монитора. Ну и т.д. - вам виднее что нужно. Добавлено через 1 минуту И уже через интерфейс VM будет связываться с Моделью и поддерживать актуальное состояние своих свойств.
0
|
||||
|
Модератор
|
||||||||
| 04.11.2021, 14:27 | ||||||||
|
Сейчас сделаю изменения и покажу здесь, что стоит исправить. Добавлено через 12 минут
Поэтому нет разницы из-за каких действий изменилось состояние Модели. Добавлено через 54 секунды xr_Sanya, и просьба - добавляйте минимальные теги XML документации для всех типов и их членов. Вам понятно, что для чего , а мне нет. Добавлено через 58 минут xr_Sanya, уточняю на всякий случай: код показанный мною разложите по разным файлам. В одном файле код только одного типа.
0
|
||||||||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||||
| 04.11.2021, 15:23 [ТС] | ||||
|
Добавлено через 54 минуты Пометил в коде с помощью TODO моменты в которых не разобрался, в основном все теже вопросы по взаимодействию модель модель и модель вью модель.
0
|
||||
|
Модератор
|
||
| 04.11.2021, 16:03 | ||
|
xr_Sanya, на пару часов занят.
Потом посмотрю, что в проекте. Если Интерфейс всё Ок, то начнём реализовывать Модель. Там станет понятнее.
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 04.11.2021, 16:21 [ТС] | ||
|
0
|
||
|
Модератор
|
|||
| 04.11.2021, 20:18 | |||
|
xr_Sanya, я смотрю вашу реализацию - вам нигде не нужно старое состояние монитора.
Тогда из параметров события его лучше убрать. 1) Сообщаете об удалении всех старых и потом по одному добавляете все новые монитры. 2) Сравниваете старый список с новым, определяете изменения, и посылаете по каждому изменению удалён, добавлен, изменён. Добавлено через 2 минуты Я уже сделал соответствующую фиксацию.
0
|
|||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 04.11.2021, 20:23 [ТС] | ||
|
0
|
||
| 04.11.2021, 20:23 | |
|
Бизнес-логика
Каково назначение папки Model в MVVM MVVM. Получение данных объекта по сети - в model или во viewmodel? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml,
в чате форсили функторы модулей как суперфичу.
Пытаясь отдуплить концепт, наткнулся на тутор с простым примером.
А главный принцип обучения от. . .
|
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
|
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
|
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|