|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||||
WPF MVVM бизнес логика и Model02.11.2021, 00:10. Показов 16240. Ответов 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
|
||
| 15.11.2021, 01:03 [ТС] | ||
|
0
|
||
|
Модератор
|
||
| 15.11.2021, 01:38 | ||
|
Тогда это уже будут полноценные Domain Entity. Вы можете их отправить в какой-то сервис, службу, но при этом модель будет знать что с ними происходит. А сейчас это больше какой-то контейнер для данных, взаимодействовать с которым можно только через методы Модели. INPC или другое событие.... Можно сделать две реализации, чтобы на практике увидеть как проще в этом случае (на вскидку - INPC будет проще), и чтобы вы в будущем знали о возможных вариантах и могли осознано выбирать лучший для конкретной задачи.
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 15.11.2021, 01:48 [ТС] | ||
|
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|
| 15.11.2021, 05:43 [ТС] | |
|
0
|
|
|
Модератор
|
||
| 15.11.2021, 11:15 | ||
|
Помните я вам писал (если не ошибаюсь), что для начинающих лучше проектировать приложение с Модели. Вот здесь будет пример того почему вроде несущественные изменения в БЛ приводят к изменению почти всей архитектуры приложения. Давайте не будем торопиться, откатимся на рабочую фиксацию с прошлой архитектурой 9adf03e1 - можете зафиксировать её в отдельной ветке.Под новую архитектуру тоже можно создать новую ветку. Начнём сначала с теоретических предпосылок. Мы хотим реализовать полноценные сущности, которые могут спокойной передаваться по всей БЛ. НО! Есть две функции которые должны остаться только за Моделью - это создание и уничтожение этих сущностей. Делегировать эти функции можно специально созданной нами коллекции MonitorDomainCollection.Она сейчас реализует интерфейс IDictionary<>, а нужно переделать на IReadOnlyDictionary<>.И добавить в него методы для создания и удаления сущности по имени. А значит и подписку на событие каждой сущности лучше делать в этой коллекции и в ней добавить событие уже с аргументом показывающем имя изменившейся модели, название изменившегося свойства и новое значение свойства. Второе, удалённая/добавленная/уничтоженная сущность должна извещать об этих своих состояниях, но у нас нет соответствующих свойств. Значит нужно добавить свойства (названия на усмотрение) IsAdded (или IsLoaded) и IsDispose. Логика такая: Добавление: 1) Модель вызывает метод коллекции Add(string name). Метод возвращает false или исключение, если с таким именем нельзя добавить; 2) Если всё Ок, то Коллекция создаёт сущность, подписывается на её событие и добавляет во внутренний словарь; 3) После добавления Коллекция меняет у сущности IsAdded = true; 4) Сущность изменила значение свойства, генерируется событие об этом, это событие генерирует событие коллекции, а то генерирует событие Модели; 5) Слушатель Модели получает событие о создании нового объекта. Генерирует его его отражение и добавляет в свою коллекцию. Удаление: 1) Модель вызывает метод коллекции Remove(string name). Метод возвращает false или исключение, если с таким именем нельзя удалить; 2) Коллекция вызывает метод удаления сущности, который доступен только ей. А как такой метод реализовать?; 3) Сущность меняет значение IsAdded = false; 4) Сущность изменила значение свойства, генерируется событие об этом. Коллекция по этому событию удаляет сущность из своего словаря и генерирует своё событие; 5) После завершения этого события, сущность уже изменяет IsDispose = true. После этого, обращение к любому другому свойству должно выкидывать исключение "Объект уничтожен". Об изменении IsDispose создаётся своя цепочка событий; А теперь вдумайтесь, что существенного изменится из=за такой логики? Самое существенно, что в Модели уже не будет создавать отражение сущности в DTO. Внутри слоя Бизнес Логики, в том числе в Сервисах, будут "путешествовать" сами сущности. А вне слоя будет уходить только стринг имена сущности и его свойства и новое значение свойства. Потребители Модели должны сами реализовать объекты отражающие сущности Бизнес Логики. Для VM это могут быть мутабельнные типы. Обдумайте всё это. Если для вас путано, то я сам начну такую реализацию.
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 16.11.2021, 02:08 [ТС] | ||
|
В последнем коммите попытался реализовать подобную архитектуру исходя их моих знаний, пометил TODO что добавлял
0
|
||
|
Модератор
|
|||||||
| 16.11.2021, 13:04 | |||||||
|
Создавать и удалять их по прежнему может только Модель. Да, и в общем случае лучше в VM реализовать своё отражение. Это в этой задаче у вас Представляются непосредственно DomainEntity. А так может быть у DomainEntity очень много свойств и методов которые не нужны на уровне View и могут быть неправильно использованы. Может быть, напротив, нужны какие-то доп. свойства, которых у DomainEntity нет. Ну, и др. Поэтому доменные сущности (Бизнес сущности) лучше выше уровня Модели не выпускать. Но на уровне Модели они могут путешествовать как угодно. Самый типичный пример - это использование их в Репозитории. Добавлено через 57 минут Сделал Фиксацию 1781c8b3:
Сделал Фиксацию e88ae3b7:
Лишние TODO (те что уже прояснены) - удалите. Добавлено через 32 минуты dynamic используется для доступа к членам объекта, которые неизвестны на момент компиляции.А здесь какие члены Value вы хотите использовать?Добавлено через 1 минуту
0
|
|||||||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|||
| 16.11.2021, 20:51 [ТС] | |||
|
0
|
|||
|
Модератор
|
||
| 17.11.2021, 09:36 | ||
|
Теперь нужно изменить интерфейс Модели с учётом того, что нет DTO. Public методы Модели могут отдавать только общедоступные типы (string, object, int и т.д.). Internаl методы могут отдавать и сами сущности - они могут использоваться в сервисах уровня Модели. Попробуйте это реализовать. Добавлено через 1 минуту В интерфейсе Модели должны быть только Public члены. Intenal будут реализованы, но в интерфейсе их не должно быть.
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|||
| 17.11.2021, 14:01 [ТС] | |||
|
0
|
|||
|
Модератор
|
||||||||||||||
| 17.11.2021, 15:02 | ||||||||||||||
|
Ведь сами Бизнес сущности - это тоже internal типы. Если он будет работать непосредственно с Бизнес сущностями, то он долен быть дружественным в Модели, то есть реализован в той же сборке или в дружественной сборке. Если же это внешний (по отношению у Модели) сервис, то тогда, конечно, он может работать только с public типами и членами. Добавлено через 39 минут Поэтому стоит тип MonitorConfiguration исключить из реализации.Логика создания нового монитора из GUI должна быть такой: 1) Запрашиваем создание монитора с указанным именем; 2) Ловим событие о его добавлении и создаём внутри VM сущность отражающую его. Эта сущность не обязательно полное отражение Бизнес Сущности. Да, VM и не знает о конфигурации Бизнес Сущностей. Здесь может быть только часть свойств и/или дополнительные свойства, может быть реализация INPC и др.; 3) По одному свойству запрашивает в Модели изменение Бизнес сущностей и по событиям Модели изменяет свойства своего отражения. И даже больше. IsDispose - можно запрашивать после удаления. Поэтому нужна обычная реализация:
Сразу сущность создаваться не будет. Сначала создание по имени, потом изменение по одному свойству. В VM нет Бизнес сущностей (Мониторов) поэтому она не может их передать. Если ей надо обратиться к стороннему Сервису, она просто указывает имя Монитора. А уже сам Сервис будет определять как ему работать с Моделью. Если он дружественный к Модели, то он может получить от неё Монитор и работать сам с Бизнес Сущностью. Если он сторонний к Модели, то работает с ней через публичный интерфейс. Добавлено через 2 минуты P.S. xr_Sanya, в такой как у нас сейчас реализации Мониторов, можно их сделать и публичными - по сути это полноценные Модели. Но давайте сделаем реализацию сначала с инкапсулированными Бизнес Сущностями. А потом следующую реализацию - сделаем их публичными.
0
|
||||||||||||||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
|
| 17.11.2021, 16:00 [ТС] | |
|
0
|
|
|
Модератор
|
||
| 17.11.2021, 19:34 | ||
|
Мы ловим IsAdded=true - по этому событию создаём отражающую сущность. По IsAdded=false - производим какие-то действия (если нужно) перед её удалением. По IsDispose=true - удаляем отражающую сущность.
0
|
||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 21.11.2021, 03:25 [ТС] | ||
|
0
|
||
|
Модератор
|
|||||||||||||||||||||||
| 21.11.2021, 10:13 | |||||||||||||||||||||||
0
|
|||||||||||||||||||||||
|
3 / 3 / 0
Регистрация: 13.07.2020
Сообщений: 229
|
||
| 21.11.2021, 22:56 [ТС] | ||
|
0
|
||
|
Модератор
|
|||
| 23.11.2021, 18:42 | |||
|
xr_Sanya, Фиксация 3532c2c2:
И другой способ Фиксация c697566c:
Поудаляйте лишнее, посмотрите может ещё что-то не работает.
0
|
|||
| 23.11.2021, 18:42 | |
|
Бизнес-логика
Каково назначение папки Model в MVVM MVVM. Получение данных объекта по сети - в model или во viewmodel? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
|
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2.
Задача:
Обеспечить запись документа в регистр сведений независимо от. . .
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
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
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|