|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||||||||
Где лучше в MVVM реализовать дополнительную логику?25.09.2025, 19:46. Показов 8801. Ответов 118
Метки нет (Все метки)
мне почему-то кажется, что это не проблема, а как раз и задумано было, чтобы можно было переназначать свойства в зависимости от нужного (например, цвет текста при value>1000, условно говоря) - вот и вынесли это DP в отдельный класс... а за пример реализации и использования в XAML - спасибо!.. ? только в каких случаях это DP подключают обычно?.. как по мне, так Styles и Templates и даже Converters - нормальные внутренние (для объекта) свойства, дальше которых уже и придумать нечего (с практической точки зрения) чтобы захотеть подключать из-вне класса ещё и DP за гранью всего, что можно задать и в объекте...
0
|
||||||||
| 25.09.2025, 19:46 | |
|
Ответы с готовыми решениями:
118
|
|
Модератор
|
|||||
| 13.10.2025, 02:54 | |||||
|
В WPF Binding работает с INotifyProptrtyChanged.PropertyChanged из любого потока. Маршалинга в UI поток не требуется. А вот для коллекций и события команд - нужен маршалинг в UI поток. А в UWP наоборот. Для PropertyChanged нужен маршалинг, а для коллекций и команд - нет. Почему так сделали... Да хрен его знает. По пьяне, наверное. Никак объяснений этому я не находил и в голову мне не приходят. Добавлено через 13 минут Я часто использую. И предпочитаю пред другими методами работы с БД. Самое элементарное. Весь смысл интерфейсов - это абстракция от реализации, слабые связи между проектами (сборками). А здесь в одной сборке и интерфейс, и его реализация. На фига тогда интерфейс вообще нужен? Просто "а что бы было!" ? Никакого смыла отдельно под Update делать два интерфейса - нет.
0
|
|||||
|
|
|||||||
| 13.10.2025, 08:53 | |||||||
|
DI в Desktop делается в несколько строк...
0
|
|||||||
|
|
|
| 13.10.2025, 10:23 | |
|
JeyCi, По поводу интерфейсов, я вообще их вынес все в отдельную сборку, которая не зависит от платформы...
1
|
|
|
9 / 7 / 2
Регистрация: 26.08.2025
Сообщений: 17
|
|||
| 13.10.2025, 14:52 | |||
|
В отличие от C++ в C# интерфейсы это единственная возможность множественного наследования.
1
|
|||
|
|
||
| 13.10.2025, 15:01 | ||
|
0
|
||
|
9 / 7 / 2
Регистрация: 26.08.2025
Сообщений: 17
|
||
| 13.10.2025, 15:16 | ||
|
0
|
||
|
9 / 7 / 2
Регистрация: 26.08.2025
Сообщений: 17
|
|
| 13.10.2025, 17:15 | |
|
Элд Хасп,
Мы зацепились не о конкретном примере, а о методике где действует принцип - никогда не говори никогда. У всех опыт ограничен и не известно, что вылезет на будущее.
0
|
|
|
|
|||
| 13.10.2025, 17:25 | |||
|
0
|
|||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||||||
| 13.10.2025, 21:22 [ТС] | ||||||
... (но не люблю сильно наращивать код, поэтому отвечаю медленно)... кстати в EF уже пока и не хочу лезть - попробую обойтись DTO (тоже пример)... потом, может внедрю...Добавлено через 56 минут
0
|
||||||
|
Модератор
|
|||||||||||||
| 14.10.2025, 00:03 | |||||||||||||
|
Это уровень Модели. Максимум что может быть в VM - это перехват исключений и прокидывание их в какой-то канал уведомлений. Откуда уже View быть их показывать пользователю. Bindig же это всего лишь удобный способ задания связи между свойством UI элемента и свойством источника (в данном контексте - свойством ViewModel). Добавлено через 27 минут Я почти на 100% уверен, что у вас эти абстракции сильно нарушены, и вы потом даже при желании не сможете разделить эти слои по разным сборкам. Для этого по факту, вам придётся заново всё переписывать и, самое сложное, переучиваться. Мой совет, пока нет опыта, не пытайтесь "экономить" на количестве сборок (проектов). Конкретно в данном случае, просто непонятно зачем нужны эти три интерфейса: IRepository<T>, ICreditApplicationRepository и IUnitOfWork. Даже если мы делаем в одной сборке, но "с прицелом" на абстракцию, то интерфейс ICreditApplicationRepository - совершенно лишний. Если вам уж очень нужно отделить метод Update от прочих, то примерная схема разделения должна быть такой:
1
|
|||||||||||||
|
|
|||
| 15.10.2025, 02:29 | |||
|
- мне нужно накатать "здесь и сейчас" небольшое приложение, код в будущем править рефакторить никто не будет. Значит юзаю static и DI тоже делаю через явные реализации. Интерфейсы применяю только там где они реально решают задачу множественного наследования. - я хочу написать что-то большое и/или в долгую (буду сопровождать). Ну или банально покрыть тестами. Можно позволить себе расписать по нормальному, а в DI использовать интерфейсы. Далее когда я зафиксировал одни из этих подходов (ну или придумал ещё какой-то), то просто следую ему. И пофиг нужен ли там интерфейс, или он избыточен -- есть общая архитектура. Это позволяет в моменте вообще не заморачиваться с тем "а как оформить код" и просто строчить. А то что нужно добавить новый файл с интерфейсом... ну это задача на пару секунд. Правда обычно это скорее всего означает что логика проникла в репозиторий (что не совсем хорошо), и это может стать бомбой замедленного действия.
1
|
|||
|
Модератор
|
|||
| 15.10.2025, 11:08 | |||
|
Тем более никаких уникальных действий здесь не нужно априори. Я показал пример выше. Три Интерфейса общего применения: IReadRepository<T>, IRepository<T>, IUnitOfWork. И один интерфейс уже специфичный для предметной области: ICreditUnitOfWork. В примере же из GitHub. Один общий интерфейс: IRepository<T> И два специфичных: ICreditApplicationRepository, IUnitOfWork. Я, например, тоже часто начинаю MVVM в одной сборке. Бывает и не разделяю его потом. Но я понимаю зоны ответственности каждого слоя и они у меня не путаются даже в одной проекте. А вот если опыта мало, если есть риск не уследить за "прониканием сквозь границы", то лучше, даже в простых случаях, делать сразу все слои изолированно по разным проектам. И у ТС, на мой взгляд, именно такой случай.
0
|
|||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
|||
| 16.10.2025, 22:22 [ТС] | |||
|
вот, что меня насторожило в своё время - здесь - :
myDbContext:- вот конкретно для моего случая (sqlite или LocalDB - write_Only_One_User), может быть using (myDbContext cntx = new myDbContext()) { .. doSomething.. } достаточно? - чем D.I. может быть более выигрышным по сравнению с простой обёрткой using scope'a вставленного в контекст async Task в однопоточном App ?? ... я вообще всегда думала, что Service's только с URL'ов или с back-end'a подключаются... или это только для разрешения зависимостей во время компиляции можно использовать, а в run-time динамически без подключения к тому же Azure или др (только если localhost), app на Win10, -- особо и неоткуда подключать зависимости...кстати там же - (та ветка с акцентом на EF по архитектуре слоёв тоже опирается на SOLID неплохо! )
0
|
|||
|
|
|||
| 16.10.2025, 23:35 | |||
|
1. убрать зависимость от new. Допустим у нас класс для работы с БД. Инициализация его экземпляра потребует откуда-то вычитать тот же ConnectionString. Т.е. мы уже не можем просто пнуть new, нам нужно сначала сделать ReadConfiguration, который может вообще правится прям в рантайме (скажем юзер может указать источник конфигураций: локальный файл или вообще облако). Тут и приходим что делать new Repository(connectionString) внутри Service не удобно, и гораздо лучше передать этот самый Repostiroy через конструктор или свойства. 2. убрать зависимость от логики инициализации объектов. Если мы делаем new внутри класса, мы всегда создаем новый объект. А если нам вдруг понадобиться singleton -- поздравляем, мы идем править ВСЕ классы, где оно используется. DI подразумевает что мы поправим только верхнюю логику (которая обычно выражается в ioc контейнерах). Это гораздо гибче, чем зашитая внутри логика и позволяет лишний раз не править класс, в зависимости от того кем и как он используется. 3. класс становится проще. Когда внедряешь полноценный ioc-контейнер, дальше работа с классом упрощается в разы: - указываешь в конструкторе нужные тебе классы/интерфейсы и закидываешь их в поля. - работает не только для сервисов и репозиториев, но и для опций и логирования - в классе у тебя только логика работы этого самого класса. Тебе фиолетово как в него попадут нужные зависимости. Не по теме: Я сталкивался когда на проекте практиковали одну(!) модель на всё, начиная от БД и заканчивая тем что попадёт в ViewModel. Вроде суицидов не наблюдал. Тут скорее нужно понять идею что "формат хранения" != "бизнес модель". Допустим такая ситуация: - пользователь в логике приложения выражен как User. Эта модель используется повсюду. - у User есть Balance, который меняется по каждому чиху. Т.е. это настолько нагруженные данные, что их нужно максимально закешировать по максимум. - также у User 100500 полей, которые меняются раз в никогда. - итого для БД логично создать две отдельные таблицы 1к1: User и UserBalance. При вычитке мы делаем запрос к обеим. При правке баланса -- только ко второй. Очень часто пытаются скроить края в том плане, что одна модель и на БД, и на бизнес логику, а в особо упоротых случаях ещё и на View улетает именно DTO. Так проще, пока не начинают вылезать различия хранения, логики и отображения. И чем больше этих различий накапливается, тем больнее это сопровождать.
0
|
|||
|
Модератор
|
||
| 17.10.2025, 01:40 | ||
|
1) Сущности с мутабельными свойствами, с атрибутами управления схемой БД, создаваемые и отслеживаемые долгоживущим контекстом - такие сущности лучше инкапсулировать в репозитории. 2) Сущности со свойствами только для чтения, без атрибутов, схема БД задаётся в контексте, создаются "одноразовым" контекстом (и следовательно не отслеживаются) - такие сущности это обычные DTO, которые могут безопасно "путешествовать" по любым слоям. Добавлено через 6 минут Во многом споры вокруг EF из-за слишком многофункциональной его реализации. Он и запросы парсит, и локальный кеш поддерживает, и сущности отслеживает, и даже DTO только для чтения может изменять и многое другое. Это его божественность и создаёт большие риски для безопасности. Поэтому если репозиторий реализуется по "недружественной" схеме, то всё "лишние хвосты" EF надо инкапсулировать в репозитории.
0
|
||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
|||||
| 17.10.2025, 11:35 [ТС] | |||||
|
******************** и если "логику - view" не разделить, то закопаться можно в попытке описывать логику в контролах (частая ошибка начинающих)... благо, в WPF между логикой и view ещё есть VM (тут всю валидацию можно сделать, которую не делает сама бд) ******************** НО ВЕДЬ ВСЕГДА ГЛАВНЫЙ ВОПРОС: СКОРОСТЬ ~ РЕСУРСЫ я там скорее цитировала про кэш (для десктоп) - не совсем понятен скепсис автора линка по отношению к использованию D.I. в desktop App ??
0
|
|||||
|
|
|||||||||
| 17.10.2025, 12:46 | |||||||||
|
Добавлено через 2 минуты Потому в EF принято создавать DbContext перед использованием через using. Тогда кэш не будет сохраняться. Добавлено через 11 минут JeyCi, Что-то типа такого
1
|
|||||||||
| 17.10.2025, 12:46 | |
|
MVVM бизнес логика и Model
Как реализовать работу нескольких окон под шаблоном MVVM? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|
|
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
|
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2.
Задача:
Обеспечить запись документа в регистр сведений независимо от. . .
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|