|
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
|
|
WPF Взаимодействие с базой данных в MVVM16.05.2022, 20:31. Показов 3939. Ответов 37
У меня есть класс, в котором реализована логика взаимодействия с БД, все таблицы хранятся в этой структуре в памяти. Этот класс инициализируется только один раз (сейчас в конструкторе App, у которого MyDataBase лежит как свойство с геттером и приватным сеттером). Как мне достать его из ViewModel и подгружать данные (в рамках MVVM)?
Да и в целом, буду благодарен любому примеру взаимодействия БД и ViewModel
0
|
|
| 16.05.2022, 20:31 | |
|
Ответы с готовыми решениями:
37
Взаимодействие баз данных с MVVM Программное взаимодействие с базой данных |
|
Модератор
|
|
| 18.05.2022, 10:10 | |
Сообщение было отмечено Harius как решение
Решение
Harius, Поясню почему классы DataClasses - это плохое решение.
Один из принципов ООП - единственность функциональности. Это означает, что объект, метод не должны "делать всё" - так называемые "методы Бога" не приветствуются. Связанно это с тем, что такие объекты трудно модернизировать, поддерживать. Вот сейчас у вас в этих классах реализована логика работы с файловой системой. И если у нас изменится Хранилище, то придётся изменить все эти классы. А так как эти классы используются во всех слоях вплоть до View, то их все тоже придётся как минимум перекомпилировать. То есть в текущей реализации полностью отсутствует абстракция Хранилища и функционал по работе с ним размазался по всему приложению. Должно быть так: - Нужно изменить Хранилище - меняем только реализацию интерфейса Репозитория. Всё остальное приложение не должно затрагиваться; - Даже если нужно изменить интерфейс Репозитория, то это должно затронуть только Модель. Вам это не очень очевидно, поскольку ваше Решение практически реализовано в одном проекте. А так не делается. Для каждого слоя нужен свой проект. Структура связей в WPF Решении Структура WPF решения Потоки в асинхронном MVVM Структура WPF+БД решения
1
|
|
|
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
|
|
| 19.05.2022, 10:40 [ТС] | |
|
Элд Хасп, репозиторий должен содержать логику загрузки из БД?
0
|
|
|
|
||||||||||||
| 19.05.2022, 11:10 | ||||||||||||
|
Добавлено через 3 минуты Нечто типа такого
0
|
||||||||||||
|
Модератор
|
||
| 19.05.2022, 12:21 | ||
|
Цель Репозитория - абстракция от Хранилища (в том числе от БД). Если в Решении используется Репозиторий, то при изменении Хранилища (в вашем случае переходе от файловой системы к БД), кроме реализации Репозитория в Решении ничего меняться не должно. А у вас логика работы с Хранилищем размазана по всем слоям - вплоть до View.
1
|
||
|
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
|
|
| 20.05.2022, 00:38 [ТС] | |
|
Элд Хасп, я реализовал слои Model и Repository в ветке feature/mvvm, не могли бы Вы глянуть, пожалуйста? Во View всё ещё очень много логики Model, постепенно убираю это и раскладываю на слои. Теперь самый большой вопрос - DTO. Как реализовать интерфейсы модели, которые будет подхватывать ViewModel?
0
|
|
|
|
|||||||
| 20.05.2022, 08:35 | |||||||
1
|
|||||||
|
Модератор
|
||||||||||||||||||||
| 20.05.2022, 10:35 | ||||||||||||||||||||
|
1) В коллективном программировании, очень желательно добавлять нормальные XML-документирование. Вот в интерфейсе IRepository, что должен делать каждый метод?
Получается у вас с одним типом может работать несколько репозиториев? Это очень не типично. И требует дополнительных объяснений. Без них я не понимаю его назначения. Так же непонятен метод SerializeToDisk(). Репозиторий абстрагирован от Хранилища и следовательно неизвестно будет ли для сохранения данных использоваться сериализация в файл или сохранение в БД. Поэтому, как минимум, этот метод нужно переименовать в Save или SaveChanged.
Так как Репозиторий это абстракция от Хранилища, а его реализация уже завязана на определённый тип Хранилища, то, однозначно, интерфейсы Репозитория и его Реализации - это разные сборки (проекты). Второй нюанс, Репозиторий работает с Моделью в типах Модели - без этого абстракцию построить не получиться. Типы Модели - это могут быть типы общего применения (int, string, кортежи, кастомные DTO и т.д.) и, если Репозиторий "Дружественный", Бизнес-Сущности. Теперь возникает вопрос, если эти типы объявлены на уровне Модели, но Репозиторий должен о них знать, а Модель должна знать о Репозитории, то где объявлять эти типы? Если в Модели, то получится циклические ссылки - такое запрещено. Поэтому все эти типы и интерфейс Репозитория должны объявлять в отдельной сборке уровня Модели. На эту сборку будут иметь ссылку и Репозиторий (реализация интерфейса) и Модель. Если делать абстрактную Модель, то для неё тоже должен объявляться интерфейс. И он тоже будет в этой же сборке-библиотеке. Добавлено через 19 минут Основная проблема в вычислительных членах (свойствах и методах). В этих классах нет INPC (и не должно быть) и если зависимости вычислений изменятся, то VM и View об этом никак не узнают. Самое оптимальное для обмена с VM - это иммутабельные DTO: классы только со свойствами только для чтения. Наравне с ними можно использовать структуры DTO, кортежи, записи. И очень сложная структура классов - за полсотни, по моему. Как-то упростить это нельзя? Добавлено через 1 минуту Гляньте само Решение на ГитХаб.
1
|
||||||||||||||||||||
|
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
|
|
| 22.05.2022, 21:51 [ТС] | |
|
Элд Хасп, посмотрите теперь) Теперь можно и IoC затронуть)
Такой вопрос, в компаниях, где запрещён CB, запрещены и DP?
0
|
|
|
Модератор
|
||
| 22.05.2022, 23:37 | ||
|
Но DP-свойства добавляются в CustomControl. А уже из них делаются представления с XAML контентом. Добавлено через 27 секунд Это типовой подход. Таким же образом созданы все дефолтные элементы. Добавлено через 1 минуту С CustomControl почти всегда отдельно ещё идёт Шаблон для темы по умолчанию.
1
|
||
|
Модератор
|
|||||||
| 24.05.2022, 14:33 | |||||||
|
Увидел вашу новую тему и только тогда вспомнил. Если долго не отвечаю - не стесняйтесь напоминать. Добавлено через 33 минуты Harius, не совсем понимаю вот эту часть:
Разве для одного типа может быть несколько репозиториев?
0
|
|||||||
|
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
|
|
| 24.05.2022, 16:06 [ТС] | |
|
Элд Хасп, да, для одного типа может быть несколько репозиториев
0
|
|
|
Модератор
|
||
| 24.05.2022, 16:19 | ||
|
Объясните где ещё используются эти репозитории для тех же типов, но с другим именем. Добавлено через 1 минуту По идее вы должны создать отражение табличной структуры в MainModel. Каждая таблица отражается через свой тип сущности. Откуда берутся другие таблицы с этим же типом?
0
|
||
|
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
|
|
| 24.05.2022, 18:53 [ТС] | |
|
Элд Хасп, да, я ошибся, двух таблиц с одним типом быть не может
0
|
|
|
Модератор
|
||
| 24.05.2022, 19:13 | ||
|
В IRepositoryManager меняется сигнатура метода: public IRepository<T> RegisterRepository<T>();.Добавлено через 7 минут Далее давайте сначала разберёмся со связями между таблицами: Clients, Contracts, Documents, Employees, Tasks. А то у мне трудно разобраться по коду. Добавлено через 2 минуты DocumentInfo, DocumenBody, Money много где используется, но для них нет таблицы.
0
|
||
|
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
|
|
| 24.05.2022, 19:17 [ТС] | |
|
Элд Хасп, всё, кроме того, для чего есть репозитории, являются вложенными классами, которые не могут существовать отдельно от своих владельцев
0
|
|
|
Модератор
|
|||||||
| 24.05.2022, 19:30 | |||||||
|
Нигде в этих типах нет INPC (и не должно быть). Может ли происходить изменение данных не из GUI (View)? Если изменяется какоое-то "вложенное" значение, как это изменение будет прокидываться в View? Например в типе DesignProject:
Cost.Amount (для примера), то как об этом "узнает" View, чтобы обновить его представление?И имена измените namespace Model.Money и/или class Model.Money.Money - вы же видите, что они конфликтуют.
0
|
|||||||
|
8 / 4 / 4
Регистрация: 13.05.2021
Сообщений: 57
|
||||
| 24.05.2022, 19:50 [ТС] | ||||
|
0
|
||||
|
Модератор
|
||||||||||||
| 24.05.2022, 20:44 | ||||||||||||
Сообщение было отмечено Harius как решение
РешениеСлишком у вас запутанная иерархия. Одних только разных типов с полсотни наберётся. При этом сама задача по первому впечатлению кажется простой и не требующей столь сложно реализации. Надо прийти к простейшему табличному представлению. Особую проблему представляют связи "многие", "ко многим". Так как сущности не могут иметь дополнительной логики - это излишне запутает всё. То с точки зрения VM и View они по факту должны быть иммутабельными. И если нужно изменить значение в экземпляре, то нужно создавать новый экземпляр. Для отражения в свойствах VM, будет нужным сделать оболочку типа такой:
Обычно для этого используется Id (int или GUID). Но вот со вложенными значениями которые есть во многих экземплярах придётся добавлять какую-то логику связи при смене Dto. Вот что-то подобное должно получиться - показываю очень сокращено, только основные, значимые моменты:
1
|
||||||||||||
| 24.05.2022, 20:44 | |
|
Взаимодействие приложения с базой данных Взаимодействие с базой данных Oracle
Взаимодействие программы с базой данных на хостинге Взаимодействие с базой данных MySQL в проекте NetBeans Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|