Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923

DependencyInjection. Эталонное внедрение зависимостей

25.04.2022, 22:25. Показов 2211. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, господа!

Есть у меня MVVM приложение.
На уровне VM я хочу инкапсулировать модель и использовать её не зная бед.

Пытаюсь внедрить зависимости, но, как я понял, это нарушает концепт "единой зависимости".
Начитался что это в общем плохо и использовать его не следует.

Решил не спешить и поинтересоваться:
- стоит ли использовать DependencyInjection;
- если да, в каких случаях;
- каким образом.

Добавлено через 5 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
    public static class ServiceLocator
    {
        public static ServiceProvider ServiceProvider { get; private set; }
 
        public static void ConfigureServices()
        {
            ServiceProvider = new ServiceCollection()
                .AddLogging()
                .AddSingleton<IHelloworldService, HelloworldService>()
                .BuildServiceProvider();
        }
    }
Немного кода, но, полагаю, это неправильно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.04.2022, 22:25
Ответы с готовыми решениями:

Внедрение зависимостей
Всем привет. подскажите пожалуйста такой вопрос. Как можно сделать зависимость бежду интерфейсом и его реализацией не используя контейнеров...

Внедрение зависимостей в .NET Ninject
Здравствуйте я читал литературу по &quot;Внедрение зависимостей в .NET&quot; мне нужно получше разобраться с этим материалом в часности как вывести...

Что такое внедрение зависимостей и зачем оно нужно?
Я почти уверен, что для тех, кто работает с ASP.NET этот вопрос покажется идиотским, но я лишь недавно начал с этим разбираться, так как...

34
 Аватар для limeniye
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
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,754
Записей в блоге: 4
26.04.2022, 16:12
limeniye, прочитайте книгу, может поможет определиться


Добавлено через 57 секунд
По названию - Внедрение зависимостей в .NET
0
26.04.2022, 16:12  [ТС]

Не по теме:

Andrey-MSK, я читал "Приключения Незнайки и его друзей" -- не помогло.


Обновлено: шутка не актуальна

0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
26.04.2022, 17:10
Цитата Сообщение от limeniye Посмотреть сообщение
Я не хочу привязываться конкретно к платформе: будь то ASP, или WPF.
Это неверно.
Даже если взять близкие паттерны MVC, MVP, MVVM, то у них разные требования к реализации Controller, Presenter, ViewModel.
И архитектура Решений хоть и получается в чём-то похожей, но всё же различий достаточно много.

Если вы будете делать универсальную архитектуру, то скорее всего она получится избыточной (и следовательно более громоздкой запутанной) чем "заточенная" под определённый паттерн, а то и задачу.

Универсальность - это хорошо, но без крайностей, ни в ущерб решению конкретной задачи.

Ваши примеры, по сути (если ничего не пропустил), это та или иная реализация синглтонов.
У этого есть свои плюсы и минусы, и далеко не для каждой задачи это подойдёт.
1
26.04.2022, 17:26  [ТС]

Не по теме:

Andrey-MSK, книгу на этой неделе не смогу посмотреть, но недели через 2 — пробегусь.

0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,754
Записей в блоге: 4
26.04.2022, 17:34
limeniye,

Не по теме:

Вот более новая версия, но на английском - Dependency Injection Principles, Practices, and Patterns

0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
27.04.2022, 09:40
Цитата Сообщение от limeniye Посмотреть сообщение
Хочу показать 2 примера от одних и тех же разработчиков, но в разных проектах:
-------------------
-------------------
- почему так?
- в чём разница?

Пример с конструктором ShowViewModel(SourceFeed sourceFeed = null) позволяет создать разные экземпляры ShowViewModel, работающие с разными экземплярами SourceFeed.
Инкапсуляция экземпляра SourceFeed определяется объектом вызывающим конструктор ShowViewModel.

Пример с SimpleIoc позволяет создать разные экземпляры OrganizationListPageViewModel, но все они будут работать с одними и теми же экземплярами IStackNavigationService, IVSTSRepository, IUserPreferencesService.
По фактически использованию эти экземпляры скорее всего являются Синглтонами.
Их инкапсуляция определяется видимостью типов (в данном случае интерфейсов) по которым они зарегистрированы.
Скорее всего они публичные и значит все эти экземпляры тоже публичны и доступны во всём приложении, то есть это полная противоположность инкапсуляции.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
27.04.2022, 10:11  [ТС]
Andrey-MSK, ну, не совсем так.
Чтобы получить экземпляр — нужно вызвать метод GetService<IStudentsService>(). Это ли не инкапсуляция?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
27.04.2022, 10:20
Цитата Сообщение от limeniye Посмотреть сообщение
Чтобы получить экземпляр — нужно вызвать метод GetService<IStudentsService>(). Это ли не инкапсуляция?
Если он вызывается для SimpleIoc.Default, то Default - это публичный статический экземпляр.
В большинстве случаев реального применения других экземпляров SimpleIoc и не создаётся.
И по факту это получается публичный Синглтон.
Его метод GetService, тоже может вызвать кто угодно.
Следовательно видимость конкретной перегрузки этого метода GetService<MyType> определяется только видимостью дженерик типа MyType.
Так как интерфейсы практически всегда публичны, то и соответствующая перегрузка тоже публична и доступна всем.
И экземпляр, возвращаемый GetService<IStudentsService>(), может получить кто угодно.
То есть инкапсуляция сведена на нет.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
27.04.2022, 10:41  [ТС]
Элд Хасп, а если изменить на internal? И какие есть альтернативы?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
27.04.2022, 11:01
Цитата Сообщение от limeniye Посмотреть сообщение
И какие есть альтернативы?
Альтернативы чему?
Это же зависит от решаемой задачи.
Невозможно сделать решения подходящего для всех задач.
Исходя из задачи выбирается та или иная реализация.

Вот вы много раз пишите об инкапсуляции.
Зачем она нужна в вашей задаче?
Что и отчего вы хотите скрыть?
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
27.04.2022, 11:06  [ТС]
Элд Хасп, в моём понимании, по стандарту обычно, создают локально модель, а потом пробрасывают через конструкторы.
В таком случае модель всегда приватная, от сего, в моём понимании — инкапсулирована от View и всех других типов, не отвечающих за слой VM.

Следовательно я искал этому альтернативы, но через конструкторы неудобно.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,754
Записей в блоге: 4
27.04.2022, 11:42
limeniye, Вот примерно что такое DI, это цитата из книги, которую я вам советовал почитать

Внедрение зависимостей – это прекрасный способ уменьшить сильное связывание между компонентами программного обеспечения. Вместо жесткого кодирования зависимостей, например, указания драйвера базы данных, вы внедряете перечень сервисов, которые могут понадобиться компоненту. Затем сервисы соединяются при помощи стороннего компонента. Эта методика позволяет вам лучшим образом справляться с будущими изменениями и другими возникающими в вашем программном обеспечении сложностями.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
27.04.2022, 12:18
Цитата Сообщение от limeniye Посмотреть сообщение
инкапсулирована от View и всех других типов, не отвечающих за слой VM.
Но метод SimpleIoc.Default.GetService<T>() доступен для всех, то есть это полная противоположность инкапсуляции.
Вы же тем не менее пишите Это ли не инкапсуляция?.
Что здесь вы подразумеваете под инкапсуляцией?

Цитата Сообщение от limeniye Посмотреть сообщение
обычно, создают локально модель, а потом пробрасывают через конструкторы
В такой реализации за инкапсуляцию отвечает слой создающий экземпляр Модели.
VM никак не может знать сохранена ещё где-лиибо ссылка на эту модель или нет.
То есть, с точки зрения VM, это не инкапсуляция экземпляра модели, а только инкапсуляция переменной (поля) VM хранящей ссылку на экземпляр Модели.
С точки зрения Реализации Приложения, то такую реализацию VM можно использовать и для инкапсуляции экземпляра, но реализовывать эту инкапсуляцию будет уже объект (например, App) создающий VM.

Вариант же с GetService лишает App возможности инкапсулировать экземпляр Модели даже если такое понадобится.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
27.04.2022, 13:31
limeniye, может вы имеете ввиду инкапсуляцию получения VieModel'ю нужного ей экземпляра Модели?
Ну, в таком случае без публичных статических экземпляров Моделей не обойтись.
А будут это просто статические свойства/поля или методы возвращающие всегда одни и те же экземпляры - не столь важно.
Реализовать это можно многими разными способами.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.04.2022, 13:31

Объясните про внедрение зависимостей в .net core. Разложите все по полочкам
Если сервис зарегистрировать как singleton (AddSingleton). То он будет один для всех пользователей? Если так, то как я понимаю singleton...

Dependency injection, как получить доступ к объекту, созданным через внедрение зависимостей?
Имеется проект WinForms, по работе с БД через EntityFramework. Используется паттерн MVP, и внедрение зависимостей, в частности с...

Внедрение зависимостей в Spring
Всем привет. Вообщем есть интерфейс, реализацию которого не я, не Spring создать не могут. Ссылка на реализацию передается в программу...

Jersey+Jetty вместе с spring внедрение зависимостей
Здравствуйте! Есть Jersey с Jetty. Простой контроллер, в который я хочу внедрить зависимость из спринга: ...

Как работает внедрение зависимостей, и зачем нужно его использовать?
Как работает внедрение зависимостей? И в каких ситуациях, зачем нужно его использовать?Например если я объявил поле как @Inject то как к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение 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
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru