|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||||
WPF MVVM бизнес логика и Model02.11.2021, 00:10. Показов 16297. Ответов 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? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|