|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||||
WPF MVVM бизнес логика и Model02.11.2021, 00:10. Показов 16203. Ответов 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
|
||
| 25.11.2021, 22:21 [ТС] | ||
|
0
|
||
|
Модератор
|
|||||||
| 25.11.2021, 23:02 | |||||||
|
xr_Sanya, сделал Фиксация e16601dc:
А то GUI получается почти всегда пустой. Первые три монитора, возможно, вообще не следует удалять.
0
|
|||||||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 26.11.2021, 05:40 [ТС] | ||
|
Ну а так вроде все работает)
0
|
||
|
Модератор
|
|||||||||||||||||||||||||||||||||
| 26.11.2021, 07:24 | |||||||||||||||||||||||||||||||||
|
Но внёс несколько изменений Фиксация 5f84f346:
Постарался не нарушить ваши изменения, но проверьте сами. Проблема с падением цикла возможно была из-за этого:
Я заменил void на Task и добавил прокидывание исключения в основной поток чтобы оно не "проглатывалось".
Из-за неправильной реализации старта и остановки цикла рандомайзера, у вас может получить одновременно несколько работающих циклов. Чтобы такого не было, надо не просто устанавливать флаг (который за время сна цикла может быть несколько раз опущен и поднят), а передавать в задачу флаг отмены. Для флага отмены я создал маленький специальный класс:
Если он уже создан (значит цикл выполняется), то старт нового цикла отменяется. Иначе создаётся новый флаг и передаётся в новую задачу:
0
|
|||||||||||||||||||||||||||||||||
|
Модератор
|
||
| 26.11.2021, 07:26 | ||
|
Добавлено через 3 минуты
И в каких случаях стоит использовать ту или иную. Добавлено через 36 секунд Как разберёмся с этим, приступим к третей реализации.
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|||
| 27.11.2021, 04:28 [ТС] | |||
|
Также View может получать только нужные ей свойства от сущности. Сами сущности могут уведомлять об изменении внутри себя. Конкретно в случае моей программы наверное лучше использовать второй способ, так как монитор в себе несет много характеристик, пускай и без сложной логики. Вроде все)
0
|
|||
|
Модератор
|
||
| 27.11.2021, 07:20 | ||
|
Обратите внимание на передачу данных между Model и View. В первом случае, у нас используется передача DTO типов отражающих полностью сущности. Изменилось одно свойство - но передаём полностью всё состояние объекта. Во первых, это достаточно объёмно по информации. Сущности могут иметь очень большое количество свойств. Во вторых, и VM и Модель должны иметь информацию о таких DTO, что возможно только если они части одного приложения. Во втором случае, а нас передаётся только аргумент события состоящий из трёх свойств: имя объекта, имя свойства, значение свойства. В такой реализации мы можем разнести Модель и VM. Модель может быть где-то на сервере в WEB. А VM в локальном тонком клиенте. "Общение" между ними происходит: - Модель сериализует аргумент события, передаёт его по сети, VM получает серию символов, десериализует аргумент события и реагирует на него; - VM так же отправляет в Модель название нужного ей метода и значение его параметра. Единственно, что не укладывается в эту схему это Рандомайзер. Но он и не должен укладываться, поскольку это просто тестовая эмуляция изменений Модели. В реальном приложении его нет и Модель измененяентся сама.
0
|
||
|
Модератор
|
||
| 27.11.2021, 07:28 | ||
|
Третья реализация - это реализация в которой Бизнес Сущности являются полноценными Моделями. Пусть маленькие, дочерние, но Модели. Для этого нам нужно довести их реализацию до состояния при котором мы сможем их передавать в VM. Так как передача в VM осуществляется у нас через интерфейс, то начать надо с того, чтобы описать все нужные публично члены этих сущностей (событие и свойства) в интерфейсе в общей библиотеке. Потом переделать интерфейс главной Модели таким образом, чтобы он сообщал только о добавлении и удалении Моделей сущностей.
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|
| 28.11.2021, 20:44 [ТС] | |
|
0
|
|
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 28.11.2021, 23:08 [ТС] | ||
|
И какие аргументы должны быть в хендлере? Только enum added и removed?
0
|
||
|
Модератор
|
|||
| 28.11.2021, 23:16 | |||
|
Если они не нужны на уровне самой Модели, то да - их лучше удалить. Больше не о чём Модель извещать не будет. Вторым параметром аргумента события будет Модель-сущность. Параметры её имя, свойство, значение свойства - не нужны.
0
|
|||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 28.11.2021, 23:37 [ТС] | ||
|
Аргументы ивента должны быть model и enum который описывает что с ней произошло. Но аргументы у нас где должны лежать в model или common? Просто из Common нет доступа к domain entity.
0
|
||
|
Модератор
|
||
| 29.11.2021, 00:19 | ||
|
Один - как и был раньше интерфейс главной Модели. Второй - интерфейс Моделей сущностей. Все типы, которые используюnся этими интерфейсами, тоже должны быть на их уровне (то есть в Common).
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 29.11.2021, 05:19 [ТС] | ||
|
Как я понял у нас есть коллекция которая имеет ссылки на модели мониторов и это является главной моделью. Нужны уведомления только уведомления о удалении и добавлении мониторов чтобы оповещать подпищиков об изменении коллекции. Возник вопрос могут ли модели мониторов быть удалены не используя методы модели? Тоесть isDispose = true ставим и коллекция сама удаляет монитор из себя. Для этого нужна подписка на INPC каждого монитора. Или же мы удаляем мониторы из коллекции только через методы коллекции, тогда нам нужно уведомлять об удалении/изменении только в соответствующих методах коллекции.
0
|
||
|
Модератор
|
|||||||||||
| 29.11.2021, 11:58 | |||||||||||
|
Можно оставить как у нас сейчас: добавляет и удаляет только сама коллекция. Можно сделать доступность удаления через саму Модель-сущность, но в этом случае надо чтобы коллекция подписывалась на события созданных ею сущностей и через них могла узнать когда её нужно удалить. На мой взгляд, второй вариант достаточно специфичен (ведь добавление всё равно останется функцией только коллекции). Возможно такая реализация где-то и пригодится, но в очень редких случаях. Добавлено через 39 минут Поэтому этот класс должен internal быть в проекте Модели.Поэтому интерфейс надо наследовать от INPC. Так же бессмысленно включать в интерфейс string ToString();.Этот метод объявлен в object и значит есть у любого объекта. При желании можно добавить в интерфейс параметрический ToString(...), чтобы в зависимости от параметров получать разные строковые представления.IMonitorConfigurationModel, а не его реализация MonitorConfigurationDomainEntity.Потребителям Модели нужны же возможности: добавлять, удалять, получить список Сущностей. Изменения самих сущностей будет через методы работы с ними и их свойства. Но то, что касается работы с коллекцией Сущностей, то это должно быть в интерфейсе Основной Модели. Но название не соответствует Правилам Именования. Их тоже лучше соблюдать. Можно посмотреть как в .Net называются аналогичные типы и их члены. В данном случае лучше, например, CollectionChangedAction.Ведь неважно для этого перечисления об уведомлении коллекции каких элементов оно уведомляет. Зависит от требований к реализации задачи. Если оставить, то подписчик сразу после подписки получает через прослушку информацию о всех мониторах. Если убрать, то подписчик после подписки должен вызвать метод Модели возвращающий все мониторы.
0
|
|||||||||||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|||
| 30.11.2021, 04:27 [ТС] | |||
|
Вроде как привел модели в рабочий вид, но что теперь во View должно быть?
0
|
|||
|
Модератор
|
|||
| 30.11.2021, 09:34 | |||
|
Допустим, выводите просто имена всех действительных Мониторов. Вам нужна подписка только на событие Основной Модели. Add - добавили имя в список, Remove - удалили. С самими мониторами вам работа не нужна. А если убрать Remove, то придётся подписываться-отписываться ещё на событие самих Мониторов. Это вопрос начальной инициализации подписчика. Вот он подписался на событие. У него пока нет коллекции всех Мониторов. Как ему её получить от Модели? Он может получить её вызвав метод основной Модели или Модель сама может ему сообщить о них во время подписки.
0
|
|||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 01.12.2021, 04:31 [ТС] | ||
|
0
|
||
|
Модератор
|
|||||||
| 01.12.2021, 08:28 | |||||||
|
В этих Моделях реализован INPC, поэтому их можно напрямую передавать в View и редактировать в View. Удаление и добавление у нас будет реализовано через события основной Модели. Можно (в учебных целях) для перестраховки, подписаться на события и Моделей Сущностей. И дополнительно контролировать их свойства IsAdded и IsDispose и по ним тоже удалять из коллекции и отписываться. Но практической целесообразности в этом нет. В View для исключения различных багов, можно коллекцию отображать не напрямую, а через фильтр отсеивая IsAdded=false или (логическое) IsDispose=true. Добавлено через 6 минут Если бы нам в View потребовались какие-то доп.свойства от сущностей (выделен, выбран, раскрыт и т.п.), то мы создали бы простейший контейнер в котором были эти свойства и свойство с сущностью:
xr_Sanya, ещё вопрос по рандомайзеру. Это просто тестовая эмуляция изменения данных из других источников? В реале её быть не должно? Если так, то не стоит его делать как "легальный" публичный интерфейс. Это должно быть просто свойство или метод в Модели, но которые не входят в её интерфейс. О конкретной реализации Модели может знать App. Поэтому VM будет вызывать метод App (через обратный вызов или событие), а он включать выключать тестовый режим Модели.
0
|
|||||||
| 01.12.2021, 08:28 | |
|
Бизнес-логика
Каково назначение папки 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
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|