|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
DependencyInjection. Эталонное внедрение зависимостей25.04.2022, 22:25. Показов 2211. Ответов 34
Метки нет (Все метки)
Приветствую, господа!
Есть у меня MVVM приложение. На уровне VM я хочу инкапсулировать модель и использовать её не зная бед. Пытаюсь внедрить зависимости, но, как я понял, это нарушает концепт "единой зависимости". Начитался что это в общем плохо и использовать его не следует. Решил не спешить и поинтересоваться: - стоит ли использовать DependencyInjection; - если да, в каких случаях; - каким образом. Добавлено через 5 минут
0
|
||||||
| 25.04.2022, 22:25 | |
|
Ответы с готовыми решениями:
34
Внедрение зависимостей Внедрение зависимостей в .NET Ninject
|
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 26.04.2022, 15:55 [ТС] | |
|
Andrey-MSK, эта тема посему и создана в разделе: C# для начинающих. Я не хочу привязываться конкретно к платформе: будь то ASP, или WPF.
И в примере выше, от меня, стандартный DI от Microsoft. Цель темы: разобраться, в каких случаях я могу использовать Ios, в каких не могу. Тут что не ответ -- все разные ))) У меня вообще своё мнение: мне кажется, если мы говорим за сервисы, то там обязательно нужно через конструкторы пробрасывать. В MVVM же паттрне, или лбом схожем, например MVC, на уровне ViewModel лучше использовать DI.
0
|
|
|
|
|
| 26.04.2022, 16:12 | |
|
limeniye, прочитайте книгу, может поможет определиться
![]() Добавлено через 57 секунд По названию - Внедрение зависимостей в .NET
0
|
|
| 26.04.2022, 16:12 [ТС] | |
|
Не по теме: Andrey-MSK, я читал "Приключения Незнайки и его друзей" -- не помогло.
0
|
|
|
Модератор
|
||
| 26.04.2022, 17:10 | ||
|
Даже если взять близкие паттерны MVC, MVP, MVVM, то у них разные требования к реализации Controller, Presenter, ViewModel. И архитектура Решений хоть и получается в чём-то похожей, но всё же различий достаточно много. Если вы будете делать универсальную архитектуру, то скорее всего она получится избыточной (и следовательно более громоздкой запутанной) чем "заточенная" под определённый паттерн, а то и задачу. Универсальность - это хорошо, но без крайностей, ни в ущерб решению конкретной задачи. Ваши примеры, по сути (если ничего не пропустил), это та или иная реализация синглтонов. У этого есть свои плюсы и минусы, и далеко не для каждой задачи это подойдёт.
1
|
||
| 26.04.2022, 17:26 [ТС] | |
|
Не по теме: Andrey-MSK, книгу на этой неделе не смогу посмотреть, но недели через 2 — пробегусь.
0
|
|
|
|
|
| 26.04.2022, 17:34 | |
|
limeniye,
Не по теме: Вот более новая версия, но на английском - Dependency Injection Principles, Practices, and Patterns
0
|
|
|
Модератор
|
||
| 27.04.2022, 09:40 | ||
|
Пример с конструктором ShowViewModel(SourceFeed sourceFeed = null) позволяет создать разные экземпляры ShowViewModel, работающие с разными экземплярами SourceFeed.Инкапсуляция экземпляра SourceFeed определяется объектом вызывающим конструктор ShowViewModel.Пример с SimpleIoc позволяет создать разные экземпляры OrganizationListPageViewModel, но все они будут работать с одними и теми же экземплярами IStackNavigationService, IVSTSRepository, IUserPreferencesService.По фактически использованию эти экземпляры скорее всего являются Синглтонами. Их инкапсуляция определяется видимостью типов (в данном случае интерфейсов) по которым они зарегистрированы. Скорее всего они публичные и значит все эти экземпляры тоже публичны и доступны во всём приложении, то есть это полная противоположность инкапсуляции.
1
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 27.04.2022, 10:11 [ТС] | |
|
Andrey-MSK, ну, не совсем так.
Чтобы получить экземпляр — нужно вызвать метод GetService<IStudentsService>(). Это ли не инкапсуляция?
0
|
|
|
Модератор
|
||
| 27.04.2022, 10:20 | ||
SimpleIoc.Default, то Default - это публичный статический экземпляр.В большинстве случаев реального применения других экземпляров SimpleIoc и не создаётся.И по факту это получается публичный Синглтон. Его метод GetService, тоже может вызвать кто угодно.Следовательно видимость конкретной перегрузки этого метода GetService<MyType> определяется только видимостью дженерик типа MyType.Так как интерфейсы практически всегда публичны, то и соответствующая перегрузка тоже публична и доступна всем. И экземпляр, возвращаемый GetService<IStudentsService>(), может получить кто угодно.То есть инкапсуляция сведена на нет.
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 27.04.2022, 10:41 [ТС] | |
|
Элд Хасп, а если изменить на internal? И какие есть альтернативы?
0
|
|
|
Модератор
|
||
| 27.04.2022, 11:01 | ||
|
Это же зависит от решаемой задачи. Невозможно сделать решения подходящего для всех задач. Исходя из задачи выбирается та или иная реализация. Вот вы много раз пишите об инкапсуляции. Зачем она нужна в вашей задаче? Что и отчего вы хотите скрыть?
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 27.04.2022, 11:06 [ТС] | |
|
Элд Хасп, в моём понимании, по стандарту обычно, создают локально модель, а потом пробрасывают через конструкторы.
В таком случае модель всегда приватная, от сего, в моём понимании — инкапсулирована от View и всех других типов, не отвечающих за слой VM. Следовательно я искал этому альтернативы, но через конструкторы неудобно.
0
|
|
|
|
|
| 27.04.2022, 11:42 | |
|
limeniye, Вот примерно что такое DI, это цитата из книги, которую я вам советовал почитать
Внедрение зависимостей – это прекрасный способ уменьшить сильное связывание между компонентами программного обеспечения. Вместо жесткого кодирования зависимостей, например, указания драйвера базы данных, вы внедряете перечень сервисов, которые могут понадобиться компоненту. Затем сервисы соединяются при помощи стороннего компонента. Эта методика позволяет вам лучшим образом справляться с будущими изменениями и другими возникающими в вашем программном обеспечении сложностями.
0
|
|
|
Модератор
|
|||
| 27.04.2022, 12:18 | |||
SimpleIoc.Default.GetService<T>() доступен для всех, то есть это полная противоположность инкапсуляции.Вы же тем не менее пишите Это ли не инкапсуляция?.Что здесь вы подразумеваете под инкапсуляцией? VM никак не может знать сохранена ещё где-лиибо ссылка на эту модель или нет. То есть, с точки зрения VM, это не инкапсуляция экземпляра модели, а только инкапсуляция переменной (поля) VM хранящей ссылку на экземпляр Модели. С точки зрения Реализации Приложения, то такую реализацию VM можно использовать и для инкапсуляции экземпляра, но реализовывать эту инкапсуляцию будет уже объект (например, App) создающий VM. Вариант же с GetService лишает App возможности инкапсулировать экземпляр Модели даже если такое понадобится.
1
|
|||
|
Модератор
|
|
| 27.04.2022, 13:31 | |
|
limeniye, может вы имеете ввиду инкапсуляцию получения VieModel'ю нужного ей экземпляра Модели?
Ну, в таком случае без публичных статических экземпляров Моделей не обойтись. А будут это просто статические свойства/поля или методы возвращающие всегда одни и те же экземпляры - не столь важно. Реализовать это можно многими разными способами.
1
|
|
| 27.04.2022, 13:31 | |
|
Внедрение зависимостей в Spring Jersey+Jetty вместе с spring внедрение зависимостей Как работает внедрение зависимостей, и зачем нужно его использовать? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Мобильное приложение 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, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|