|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||||
WPF MVVM бизнес логика и Model02.11.2021, 00:10. Показов 16273. Ответов 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? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программа опроса у.з. расходомера 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 (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|