|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
|||||||||||||
Разделение функционала между слоями MVVM на примере создания простого WPF приложения с БД10.02.2024, 00:12. Показов 8826. Ответов 182
Метки нет (Все метки)
Тема создана разделением темы Вывод на печать изображения MVVM
Кликните здесь для просмотра всего текста
0
|
|||||||||||||
| 10.02.2024, 00:12 | |
|
Ответы с готовыми решениями:
182
ASP.NET MVC - разделение функционала между различными view
WPF нюансы создания проводника и мелочи по MVVM |
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||||||||||||
| 12.02.2024, 19:27 [ТС] | ||||||||||||
Элд Хасп, разобрался.
Добавлено через 29 минут Элд Хасп, я сейчас все прелести mvvm почувствовал. Сильно изменил проект. На view это даже никак не отразилось, ни едной ссылки в ней не поменял Добавлено через 20 минут Элд Хасп, обновил репозиторий. Не много сократил ваш код, вынес класс авторизации в отдельный. Но ваш метод авторизации не смог сделать пока что. Если по функционалу у нас есть отличается, то доделаю его в проекте. Сейчас отличи с гит я не вижу, но и иза слияния не знаю, есть или нет они. А целом вы можете заменить проект в своей ветке на мой, чтобы не было сильных отличий для будущей работы.
1
|
||||||||||||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||||||||||||||||||||||
| 13.02.2024, 14:01 [ТС] | ||||||||||||||||||||||
|
Элд Хасп, я перенесу в свою ветку нужную часть вашего обновления. А в целом проекты до сих сильно отличаются, я изменил код репозитория на другой, основные команды Add, Remove Они удобны для использования из другого класса, но функционал по типу FirstOrDefault, Any, Where, Include, в обычном проекте без этого никак, из вариантов делать методы с перезагрузкой разной, для разных типов, но этот код не универсален. Поэтому реализовал обобщенные методы этих команд. В целом это работает, но использование не очень удобное ибо метод нужно приводить к нужному типу при вызове.
Пример
Но для примера разделения логики это хороший вариант. Добавлено через 2 часа 56 минут Вышло о чем писал выше.
0
|
||||||||||||||||||||||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
|
| 26.02.2024, 18:14 [ТС] | |
|
Элд Хасп, освободился немного наконец то. Обновил решение на гит, добавил настройки приложения, вывод и работу с товарами, добавил вашу реализацию с проекта Common(решение впечатляет) для бд сделал Crud.
Авторизацию по вашему примеру не сделал, не пойму как связать события Vm и т.п. Вашу ветку можете заменить на мою, так будет лучше, приведем ветки к единому решению наконец то) Добавлено через 1 час 50 минут Элд Хасп, сделал авторизацию используя события. Теперь жду критику\советы)
0
|
|
|
Модератор
|
||||||||||||
| 26.02.2024, 20:20 | ||||||||||||
1
|
||||||||||||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
|
| 26.02.2024, 20:21 [ТС] | |
|
Элд Хасп, тут точно нужно подправить, похоже остатки старого кода это
0
|
|
|
Модератор
|
|||||||||||
| 26.02.2024, 21:22 | |||||||||||
0
|
|||||||||||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
|
| 26.02.2024, 21:24 [ТС] | |
|
Элд Хасп, принял, перемещу.
0
|
|
|
Модератор
|
||||||||||||||||||||||||||
| 26.02.2024, 22:01 | ||||||||||||||||||||||||||
|
Вот мой класс для работы с
PropertyDescriptor
Очень надумано класс выглядит:
Для класса Authorized тоже нужен интерфейс:
Классы Person и Product объявлены в Репозитории. А репозиторий у нас жёстко завязан на определённое Хранилище. С другой стороны эти классы проникают до VM, а VM используется в View. И получается, если мы хотим изменить хранилище, то нам придётся прекомпилировать ВСЕ слои. А смысл паттернов MV* - обеспечить независимость слоёв. Следовательно объявление Person и Product в Репозитории полностью ломает концепцию паттернов MV* и Репозитория. Решение. 1) Сделать Person и Product общедоступными DTO в библиотеке Common; 2) Создать в Common интерфейсы для этих классов и передавать между слоями через интерфейсы.
0
|
||||||||||||||||||||||||||
|
Модератор
|
|
| 26.02.2024, 22:04 | |
|
Связи проекта VM:
А мы в начале, насколько помню, оговаривали такую схему: Структура связей в WPF Решении Следовательно ссылки в проектах решения могут быть только на проект Common. Только проект App (не View) может ссылаться на другие проекты, кроме Common.
0
|
|
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||||||||||||||
| 26.02.2024, 22:53 [ТС] | ||||||||||||||
Поэтому я удалил реализации классов Person и Product, их код дублируется и если менять источник данных, то придется лезть в оба(все классы) Если Person и Product завязаны на реализациях своих классов, то почему нельзя использовать один класс который реализует для многих тот же код? Я привык писать как можно короче, и не хотелось бы дублировать код. Если нужны были бы функции касательно только одного класса, то без сомнений лучше создать отдельный класс. Добавлено через 14 минут
0
|
||||||||||||||
|
|
|||
| 26.02.2024, 22:58 | |||
|
1
|
|||
|
Модератор
|
|||||||||||
| 26.02.2024, 23:12 | |||||||||||
|
Что будет если создать такой экземпляр:
PropertyDescriptor, в отличии от PropertyInfo использует общий с привязками (Binding) механизм уведомления об изменении значения свойства.Поэтому с помощью PropertyDescriptor можно менять свойства у любого класса, даже без INPC, и привязки автообновят целевой свойство.См.: Разъяснение PropertyDescriptor: Почему в некоторых случаях Binding правильно работает без INPC (INotifyPropertyChanged)? Прослушивание изменений DependencyProperty Попробуйте каждый проект раскидать по разным Nuget пакетам. Потом измените пакет DataBase и увидите, что для подхвата изменений, придётся перкомпилировать и перезалить все остальные пакеты тоже.Скажем так - это ваш некий кастомный аналог общий библиотек Standard 2.0. Поэтому простые DTO (лучше иммутабельные классы, записи или, если мутабельные, то структуры) можно помещать в эту библу. Он может работать только с Person и Product. Никакой другой тип этот класс не может принять.
0
|
|||||||||||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
|||
| 26.02.2024, 23:15 [ТС] | |||
|
wizard41, судя схеме у меня не хватает только проекта который объединит всё.
Но если смотреть зависимости проекта Vm, то DataBase(бд) - если это отдельный проект, то он будет зависимостью везде где идет работа с данными, Repositories содержит команды и интерфейсы, так как команды это работа с данными то DataBase нельзя убрать, Common реализация для работы с Vm(хелпер). Получается что эти три зависимости обязательны, но можно было сделать в одном проекте их реализацию. Или же объединить в другом, тогда Но так как задача примера разделить всё по слоям, чтобы меньше скакать можно где то сделать зависимости, или же ну или же придётся класс с работой с данными объединить с бд, а отдельную реализацию Элд Хасп удалить из проекта и скопировать её в Vm проект. Поэтому тут нет фанатизма, в случае с объедением другой проект, он примет все эти зависимости на себя.
0
|
|||
|
Модератор
|
||
| 26.02.2024, 23:18 | ||
|
Нужно сделать фанатично правильную реализацию MVVM для учебных целей. Чтобы понять на практике границы функциональных слоёв. Добавлено через 3 минуты xellan24rus, так как у вас явно нет понимания, что такое проекты, почему какие-то связи между ними допустимы, а другие нет, то предлагаю ещё усложнить задачу. Каждый проект делаете в отдельном Решении (но всё в одном Репозитории на GitHub). Каждое решение собираете в пакет и заливаете на NuGet. Все связи между пакетами через NuGet.
0
|
||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
|||||||
| 26.02.2024, 23:45 [ТС] | |||||||
|
Добавлено через 9 минут Получается только одна зависимость не в том месте. Добавлено через 9 минут Элд Хасп, а с другой стороны если я хотел бы использовать Repositories на сервере чтобы объявить интерфейсы и использовать готовые команда для работы с данными. Если этот проект будет в Common, то зачем мне на сервере реализации INPC из проекта Common. В случае с ConsoleApp он у меня ссылается только на Repositories, будь серверный проект то достаточно было бы той же зависимости Repositories. Нагружать решение лишним тоже не очень хорошо, в текущем примере для ConsoleApp не нужно знать что есть реализации INPC если бы я перенес Repositories в Common. Только лишний вес для приложения таким темпом прибавится.
0
|
|||||||
|
Модератор
|
||||
| 26.02.2024, 23:54 | ||||
|
Обычный класс - ваш Person. Без INPC. К его свойствам привязки в XAML. Теперь вам нужно поменять значение одного из свойств Person: SelectedPerson.CompletedTasks = 123; Изменив так в Шарпе, вы не сможете изменить представление этого значения в View, так как нет реализации INPC.Но если измените SelectedPerson.SetValue(nameof(Person.CompletedTasks), 123);, то привязка автообновит представление.Добавлено через 2 минуты ![]() Только интерфейсы и типы используемыми этими интерфейсами. Реализации интерфейсов, как были в отдельных сборках, так и должны в них оставаться. Добавлено через 2 минуты Вы сейчас не замечаете, что из-за паразитных зависимостей, при изменении DataBase приходится перекомпилировать все вышестоящие проекты. Это происходит фоном и вы, скорее всего, счтитаете даже что этого и не происходит вовсе.А когда у вас каждая сборка будет в NuGet, когда каждую версию нужно будет "ручками" заливать в NuGet, вы "ой как" прочувствуете что такое паразитные зависимости и почему их следует избегать. Добавлено через 1 минуту Даже не в NuGet - можете своё локальное хранилище пакетов сделать. Добавлено через 55 секунд Но с NuGet - это тоже очень полезный опыт для разработчика. Поэтому всё же советую освоить как заливать туда пакеты и потом их оттуда использовать.
0
|
||||
|
Модератор
|
|||||||
| 26.02.2024, 23:57 | |||||||
|
Но с NuGet - это тоже очень полезный опыт для разработчика. Поэтому всё же советую освоить как заливать туда пакеты и потом их оттуда использовать.
Вот здесь зависимость:
var и увидите - что это DataBase.Product:
0
|
|||||||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||||
| 27.02.2024, 00:02 [ТС] | ||||
|
0
|
||||
| 27.02.2024, 00:02 | |
|
Структура WPF приложения на MVVM
Паттерн MVVM или как писать приложения на WPF
Пример переключения между окнами WPF MVVM Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|