|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||||
WPF MVVM бизнес логика и Model02.11.2021, 00:10. Показов 16505. Ответов 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
|
|
Модератор
|
||||||||
| 04.11.2021, 20:34 | ||||||||
|
У вас этот класс используется от начала до конца сеанса приложения. Занимает он в памяти - ну, килобайт может быть. Зачем все эти выкрутасы? Сделайте проще, привычнее:
Добавлено через 5 минут xr_Sanya, я уже у вас раньше спрашивал, вы не ответили. Чем идентифицируется монитор? Значениями каких свойств? Вот есть два экземпляра MonitorConfiguration. Как понять, что они отражают один и тот же монитор или два разных? Добавлено через 2 минуты Он же ничего не делает. В сервисы объединяю члены для разгрузки кода каких-то объектов. В данном случае для разгрузки Модели. Но в этом сервисе ничего нет. Он ничего не разгружает, только геморрои создаёт со своим использованием. Зачем вы его создавали?
0
|
||||||||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 04.11.2021, 20:35 [ТС] | ||
|
0
|
||
|
Модератор
|
||
| 04.11.2021, 20:39 | ||
|
Мониторы - это ФИЗИЧЕСКИЕ устройства. А тип MonitorConfiguration является отражением этого монитора. А вы его идентифицируете каким-то непонятным списком который никак не связан с ФИЗИЧЕСКИМИ мониторами. Полная пурга. Нужен какой-то уникальный ключ, который жёстко связан с железом монитора.
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 04.11.2021, 20:40 [ТС] | ||
|
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|||
| 04.11.2021, 20:43 [ТС] | |||
|
Добавлено через 47 секунд
0
|
|||
|
Модератор
|
|||
| 04.11.2021, 20:48 | |||
|
А что в проекте работает с ФИЗИЧЕСКИМИ мониторами? Или в этом проекте вас этт момент не интересует, и вы не задавали соответсвующий сервис (или что-то иное)? Добавлено через 1 минуту Есть ли у вас какой-то объект который следит за физическими мониторами и уведомляет об изменении их характеристик?
0
|
|||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|||
| 04.11.2021, 20:58 [ТС] | |||
|
Но чтобы различать эти источники отображения (например после перезагрузки системы или замены мониторов местами) я привязал их к системной информации мониторов. Приложение регулирует GCID(параметры цветов) источника отображения (не монитора), но вся проблема в том что если не связывать источник отображения с монитором, то хранить информацию о настройках источника отображения не получится и если вдруг поменяет система мониторы местами или сделает это пользователь, то настройки таких мониторов будут некорректные, так как источники отображения тоже поменяются, но в произвольно порядке. Поэтому идентифицировать источник отображения по его имени нельзя. Для решения этой проблемы я использую библиотеку которая позволяет получать данные мониторов, в том числе и имя их источника отображения. Добавлено через 1 минуту Тоесть монитор как таковой нужен только чтобы идентифицировать источник отображения привязанный к нему. И для хранения настроек, чтобы привязываться к уникальному идентификатору монитора.
0
|
|||
|
Модератор
|
|
| 04.11.2021, 21:10 | |
|
xr_Sanya, то есть всё что вам нужно - это следить за списком
List<MonitorConfiguration> _monitors?Там находятся виртуальные объекта, но большего и не нужно? Если нужно следить за этим списком, то нужны события извещающие об его изменении. Это же у вас отдельный сервис. И следовательно предполагается, что у него может быть несколько потребителей которые независимо могут изменять данные. Я бы лучше его инкапсулировал в Модели, чтобы кроме Модели никто не мог на него влиять. А модель уже будет "разрулировать" между несколькими потребителями.
0
|
|
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|||||||
| 04.11.2021, 21:16 [ТС] | |||||||
|
Вот немного расписал что конкретно хранит в таблица с мониторами
0
|
|||||||
|
Модератор
|
||
| 04.11.2021, 21:20 | ||
|
В ней же есть Бизнес Сущности и, соответственно, есть Бизнес Логика. Добавлено через 1 минуту Тогда интерфейс нужно реализовать в этом Сервисе. А лучше переименовать его в Модель, раз по функционалу он и есть Модель. Добавлено через 44 секунды До полнеценной Модели там не хватет только событий уведомляющих об изменениях.
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|||||
| 04.11.2021, 21:49 [ТС] | |||||
![]() Я собирался разделить эти данные, но не успел, так как хочу сперва разобраться с архитектурой приложения. Добавлено через 4 минуты Добавлено через 1 минуту Добавлено через 17 минут Добавлено через 5 минут в приложении SettingsService и ScreenModel связаны между собой. SettingsService занимается заполнением данных, а ScreenModel предоставляет для ViewModel методы, которые работают с сущностями таблицы SettingsService.Screens, для того чтобы корректно заносить данные из пользовательского ввода в эту таблицу. Другим сервисам для корректного занесения данных не требуется ScreenModel, они заносят данные напрямую в SettingsService.Screens
0
|
|||||
|
Модератор
|
|
| 04.11.2021, 23:10 | |
|
xr_Sanya, Чё-то как-то очень запутано.
Должно быть место где находятся ваши Бизнес Сущности. Должны быть методы для обращения к ним. Если членов очень много, и они как-то подаются функциональной группировке и отделению от места хранения Бизнес Сущностей, то можно создать Сервис. Типичный пример Маппер. Он ничего не хранит и в нём только статические методы отражающие одни типы на другие. А у вас размазались по многим типам сами Бизнес Сущности и непосредственно их функционал. Добавлено через 5 минут Сейчас переделать архитектуру вашего приложения будет сложно. Поэтому для понимания, давайте займёмся тестовым проектом. Ту модель что мы делали - это реализация Бизнес Логики и в первую очередь хранилище Бизнес Сущностей (их пока ещё нет). Вам нужно в этот класс перенести весь сервис SettingsModel. Так же нужно добавить internal классы для Бизнес Сущностей Мониторов. Именно в них будет храниться информация. И, конечно, нужно какое-то свойство-ключ. Без этого будет невозможно подерживать связб между Бизнес Сущностями и их отражением.
0
|
|
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||||||
| 04.11.2021, 23:17 [ТС] | ||||||
|
Добавлено через 1 минуту Добавлено через 3 минуты
0
|
||||||
|
Модератор
|
|||
| 04.11.2021, 23:27 | |||
|
Потом к ней добавим другую. Но вам надо как-то выделить собственно то что является вашими Бизнес Объектами.
0
|
|||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|
| 04.11.2021, 23:56 [ТС] | |
|
0
|
|
|
Модератор
|
||||||||
| 06.11.2021, 20:00 | ||||||||
|
На Гите последняя фиксация от 02.11.2021. Добавлено через 2 минуты xr_Sanya, ох, блин! Я не тот Реп смотрел - запутался. Добавлено через 12 минут Я сделал изменения и зафиксировал:
0
|
||||||||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 06.11.2021, 20:32 [ТС] | ||
|
0
|
||
|
Модератор
|
|||
| 06.11.2021, 21:11 | |||
|
xr_Sanya, сделал Фиксацию 47ad01e5:
Но изменения не полные. Просто показал пример в каком направлении надо идти. Будут вопросы - пишите. Добавлено через 1 минуту Я не совсем понимаю как у вас Сервис связан с Бизнес Сущностями, поэтому в своём примере сервис не использовал. Но вы добавьте его туда где это нужно. Добавлено через 1 минуту Бизнес Сущности должны быть полностью инкапсулированы в слое Модели. Из него будут выходить только их слепки. Добавлено через 1 минуту P.S. xr_Sanya, и на будущее. Если я долго ничего не отвечаю - не стесняйтесь напомнить. Просто за своими делами могу забыть о вашей теме.
0
|
|||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|||
| 07.11.2021, 05:51 [ТС] | |||
|
Как я понимаю: MonitorDomainCollection - словарь со своими методами, тоесть место хранения всех сущностей и адаптирвоанные к ним методы из IDictonary. MonitorConfigurationDto - дата трансфер, для того чтобы менять данные в словаре либо их получать. MonitorConfigurationDomainEntity - бизнес сущность, но я не совсем понимаю для чего она используется когда есть DTO, я понимаю что DTO это класс который содержит в себе только данные для передачи куда либо, но сущность тоже вроде как не имеет данных. Метод маппера CopyTo тоже не совсем понятен. Тоесть чтобы подготовить модель к работе нужно создать экземпляр класса MonitorModel и вызвать в ней метод Create для нужных сущностей, тем самым мы получим готовую модель. Получить данные можно с помощью MonitorModel.GetMonitors(), это должно вернуть копию MonitorDomainCollection. Менять данные модели мы можем только ее методами. Сервис должен хранить настройки всего приложения как единая точка к которой можно обратится и получить/поменять нужный параметр, не знаю насколько это хорошая идея, но как по мне она упрощает структуру. В моем приложении сервис создавал место хранения бизнес сущностей (List) и собственно заносил их туда чтобы к ним был доступ из всего приложения. Вообще конечно тяжелая для понимания логика работы с моделью) Как же те примеры со студентами в которых один класс c INPC ![]() Добавлено через 3 часа 19 минут Посмотрел плейлист, немного разобрался с моделью и DTO Плейлист
0
|
|||
| 07.11.2021, 05:51 | |
|
Бизнес-логика
Каково назначение папки Model в MVVM MVVM. Получение данных объекта по сети - в model или во viewmodel? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
|
Скрипты 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: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|