powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Dependency injection. Как скрыть внутренние реализации ?
25 сообщений из 58, страница 1 из 3
Dependency injection. Как скрыть внутренние реализации ?
    #39285407
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Как я понимаю реализация паттерна DI такова (на примере Asp Net Mvc), что есть один контейнер и в нем зарегистрированы все все все сущности.
Как тогда реализовать DI в ситуации,когда у нас в DLLке есть интернальные классы, имеющие смысл внутри только этой DLLки ?

Если у нас имеется лишь единый контейнер, куда мы вынуждены зарегистрировать сотню наших интернальных классов, то там свалка вообще получится да и мы тогда отдаем свои интернальные классы наружу.
Неужели нужно внутри этой библиотеки организовывать свой внутренний DI что ли ? Да еще скрещивать его с внешним DI, ведь класс доступный публично придется регистрировать в обоих контейнерах. Это прям почти какой-то "containers hell" получается :)

Есть какое-то решение для данной проблемы, или нету проблемы вообще ?
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39285611
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekКак тогда реализовать DI в ситуации,когда у нас в DLLке есть интернальные классы, имеющие смысл внутри только этой DLLки ?

С помощью концепции модуля. Именно так и делается, даже в рамках одного приложения и нескольких DLL. Каждый модуль (каждая DLL) сама себя регистрирует в контейнере, свои зависимости. И как раз регистрируются интернальные имплементации публичных интерфейсов. Если интерфейс тоже интернальный, то за пределами модуля всё равно эту зависимость не получить.

Но! Если у разработчика DI головного мозга, когда каждый чих делается через зависимость, то эту болезнь надо лечить, а не искать «решение».

Желательно обходиться без DI там где это можно — максимально. Если что-то делается только внутри одного модуля и не выходит наружу, то в таких случаях лучше вообще избегать использования контейнера.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39285619
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНо! Если у разработчика DI головного мозга, когда каждый чих делается через зависимость, то эту болезнь надо лечить, а не искать «решение».

Желательно обходиться без DI там где это можно — максимально. Если что-то делается только внутри одного модуля и не выходит наружу, то в таких случаях лучше вообще избегать использования контейнера.
+100500
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39285642
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНо! Если у разработчика DI головного мозга, когда каждый чих делается через зависимость, то эту болезнь надо лечить, а не искать «решение».


А как иначе быть ? Если не DI будет через конструктор (чаще всего) инжектить зависимости то кот ?
Хардкодить создание классов по месту использования ? А как же юнит-тестирование ?
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39285679
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek, Вы конкретный пример приведите того, что за "интернальные", почему их надо инжектить, почему без этого нельзя покрыть юнит-тестами?
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39285702
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

Ну пожалуйста. Чисто абстрактный пример.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
internal class ClassSlow: ICalculator
    {
        private readonly string _someData1;
        private readonly string _someData2;
        public ClassSlow(string someData1, string someData2)
        {
            _someData1 = someData1;
            _someData2 = someData2;
        }

        public int GetResult() { return 1; } 
    }

    internal class ClassFast: ICalculator
    {
        public int GetResult() { return 2; }
    }

    public class Service: IService
    {
        private readonly ICalculator _slowCalculator;
        private readonly ICalculator _fastCalculator;

        public void Add5ToCalculatorResult(bool isFast)
        {
            if (isFast)
                return _fastCalculator.GetResult() + 5;
            else
                return _slowCalculator.GetResult() + 5;
        }
    }



Либа которая может рассчитать медленно но точно, или быстро но не очень точно (абстрактный пример же).
Внешнему миру нужен доступ к IService. Сам сервис зависит от реализаций ICalculator, о которых внешнему миру просто не интересно знать (а может даже и не нужно).

Очевидно помещать создание этих классов в Service не правильно потому, что
- это сильно свяжет его с этими классами. В частности ему придется знать про некие параметры someData1, someData2.
- не получится протестить этот класс, передав ему мок-стаб вместо этих ICalculator.

Поэтому получается, что фактически да, нужно использовать DI на каждый чих. Везде, даже во внутренних классах библиотек.

Просто стало интересно как правильно конфигурировать интернальные классы в DI контейнере, создал темку.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39285808
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekskyANA,
Ну пожалуйста. Чисто абстрактный пример.

Чисто абстрактный класс вместо интерфейса + factory method - и DI в данном случае не нужен.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39285834
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekПоэтому получается, что фактически да, нужно использовать DI на каждый чих.

Не получается. Приводить такой пример, для которого оправдано применение DI в подтверждение тезиса «на каждый чих», это как доказывать что молотком забивать гвозди — совершенно нормально.

Решать конечно тебе. Но скажу сразу, за повальное применение DI где надо и где не надо, особенно в закрытых модулях как часть внутренней реализации -- по головке тебя за это не погладят. Будешь в джуниорах ходить до старческих штанов. Учись кодить правильно, включай голову!
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39285837
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekПросто стало интересно как правильно конфигурировать интернальные классы в DI контейнере, создал темку.

В модулях вместо DI, можно использовать классическую реализацию паттерна Стратегия. Возможно, тебе как раз таки не калькулятор тут нужен, а сам метод вычисления, при чём это не зависимость, а явное требование передать конкретный алгоритм для вычисления (быстрый, медленный, унылый, весёлый...). Ты явно не на том сосредоточился.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286034
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot hVostt]ProBiotek Желательно обходиться без DI там где это можно — максимально.
а можно подробнее? просто это такое максималистское заявление. не могли бы вы объяснить почему так категорично?
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286047
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!а можно подробнее? просто это такое максималистское заявление. не могли бы вы объяснить почему так категорично?

Что конкретно в этом утверждении не нравится? Давайте обсуждать не характер заявлений (то, как вам кажется), а предметно.

Я могу пояснить, что за всё нужно платить. Если DI позволяет решить малой кровью некоторые проблемы в архитектуре, то злоупотребление им может нанести больше ущерба, чем пользы. Это относится к любым инструментам и методикам.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286049
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttwinsky!а можно подробнее? просто это такое максималистское заявление. не могли бы вы объяснить почему так категорично?

Что конкретно в этом утверждении не нравится? Давайте обсуждать не характер заявлений (то, как вам кажется), а предметно.

Я могу пояснить, что за всё нужно платить. Если DI позволяет решить малой кровью некоторые проблемы в архитектуре, то злоупотребление им может нанести больше ущерба, чем пользы. Это относится к любым инструментам и методикам.
я не говорил, что не нравится. я сказал, что утверждение слишком громкое. я имею в виду, что я могу вообще обойтись без DI и это будет именно "максимально".
и я спрашиваю очень предметно, какой вред может принести использование паттерна?
т.е. - в каких случаях его применение оправданно, а в каких нет?
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286084
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!я сказал, что утверждение слишком громкое.

ну так и ваш комментарий можно оценить, как слишком злобное, показывающее, что вам категарически что-то не нравится, что почему-то в следующем комментарии вы также категорически отрицаете :) т.е. такой дискурс ни к чему хорошему не приведёт, суждения о суждениях. давайте лучше предметно.

winsky!какой вред может принести использование паттерна?

употребление DI приводит к новому уровню абстракции, и это усложняет понимание системы. если программист начинает злоупотреблять DI, то прочитать его код становится сложной задачей, а понять — ещё сложнее. стоит ли говорить, к чему это в итоге приводит? об этом хорошо написано у первоисточника, автора этого принципа Роберта Мартина.

чтобы не попасть в ловушку абстракций и не создавать лишней косвенности, переусложнённого дизайна, надо изначально понимать, для чего вообще нужен DI.

вы вот, сможете ответить на этот вопрос?

winsky!т.е. - в каких случаях его применение оправданно, а в каких нет?

если сможете ответить на мой вопрос, то он в принципе должен содержать ответ на этот. а если нет, то лучше вам обратиться к специальной литературе и попрактиковаться в реальных приложениях.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286149
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эм... давайте определимся. мы говорим о dependency inversion principle или о паттерне dependency injection?
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286200
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Вы тоже в своих ответах весьма абстрактны. не привели ни одного примера (а я привел) когда DI не нужен и КАК его заменить, чтобы классы остались достаточно unit-тестируемы (т.е. без тестирования всей кучей с их зависимостями). Как создавать описанные Вами стратегии и как их передавать в класс, который в них нуждается (кто или что этим будет заниматся, если не DI). Это может быть интересно. Может потом действительно можно будет взять на вооружение.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286304
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekПоэтому получается, что фактически да, нужно использовать DI на каждый чих. Везде, даже во внутренних классах библиотек.
Уточните пожалуйста, где в Вашем примере используется DI "во внутренних классах библиотек".
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286341
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

Ну при конфигурировании IService нужно будет регистрировать его зависимости ICalculator.
Потом DI их либо автоматически отрезолвит, либо мы можем сами через метод Resolve<>. Но это происходит вне указанной в примере системы. Т.е. IService должен уже получать на вход сконструированные классы.

Вопрос был "привести пример внутренних классов, которые нужно конфигурировать в DI и почему их нельзя тестить без этого".
Отвечаю (выше это уже написал), если конструировать ICalculator внутри IService это вынудит IService знать про некие параметры someData1, someData2. А также не позволит его нормально протестировать передав моки-стабы вместо ICalculator.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286480
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek, короче hVost Вам выше уже ответил: каждая DLL сама себя регистрирует в контейнере.

А пример Ваш толком ничего не показывает, уж извините :)
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286519
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!эм... давайте определимся. мы говорим о dependency inversion principle или о паттерне dependency injection?

Мы говорим об DI, который в свою очередь является формой IoC в реализации. Смысл говорить о принципах не применительно к коду? Так вернёся к вопросу. Для чего нужен DI?
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286532
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekhVostt,

Вы тоже в своих ответах весьма абстрактны. не привели ни одного примера (а я привел) когда DI не нужен и КАК его заменить, чтобы классы остались достаточно unit-тестируемы (т.е. без тестирования всей кучей с их зависимостями). Как создавать описанные Вами стратегии и как их передавать в класс, который в них нуждается (кто или что этим будет заниматся, если не DI). Это может быть интересно. Может потом действительно можно будет взять на вооружение.

Я очень конкретно ответил. Примеры кода я приведу, когда вы опишете конкретную проблему. Если вы переживаете, что в контейнере слишком много зависимостей — и что лучше будет, если у каждого модуля будет свой личный контейнер — не стоит этого делать и не стоит переживать. Проблемы не существует.

Паттерн Стратегия описан очень хорошо на всех языках, гуглится на раз. Зачем я буду пыжиться и демонстрировать вам свои авторские способности по описанию паттернов, если это уже давно сделано и легко доступно? Паттерн Статегия зачастую гораздо лучше решает некоторые задачи, чем DI. Скажу по секрету, есть ещё и другие архитектурные паттерны. Стоит их изучить. И у вас будет много других гораздо более интересных вопросов, чем беспокойство о количестве зависимостей в контейнере.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286546
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Паттерны я знаю, и кто такие GOF )
Вопрос был в том, как инжектить эти интернальные стратегии - суть зависимости в класс. Ну в принципе я понял Вашу идею о том, чтобы регистрировать все в одном большом контейнере.
Просто подумал о том что раз есть классы internal то как это должно правильно соотносить с DI. Ладно может проблемы нету, ок.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286933
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekhVostt,

Паттерны я знаю, и кто такие GOF )

Разве?
https://ru.wikipedia.org/wiki/Банда_четырёх «Ба́нда четырёх» (кит. трад. 四人幫, упр. 四人帮, пиньинь: Sìrén bāng, палл.: Сы жэнь бан) — термин (фактически идеологический ярлык), используемый в официальной китайской пропаганде и историографии для обозначения группы высших руководителей Коммунистической партии Китая, выдвинувшихся в ходе Культурной революции 1966—1976 годов, являвшихся наиболее приближенными к Мао Цзэдуну лицами в последние годы его жизни.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39286999
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

Ну я именно это и имел ввиду. А Вы других GOF что ли знаете еще ? )
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39287056
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekЕсли у нас имеется лишь единый контейнер, куда мы вынуждены зарегистрировать сотню наших интернальных классов, то там свалка вообще получится да и мы тогда отдаем свои интернальные классы наружу.Ну и в чём проблема? Ты всё равно из других сборок не сможешь запросить штатным способом internal-типы из контейнера, потому что компилятор выдаст ошибку. Чудеса рефлекшена не рассматриваем.
...
Рейтинг: 0 / 0
Dependency injection. Как скрыть внутренние реализации ?
    #39287072
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЧудеса рефлекшена не рассматриваем.
как это DI и без чудес рефлекшна ?
...
Рейтинг: 0 / 0
25 сообщений из 58, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Dependency injection. Как скрыть внутренние реализации ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]