|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
Привет. Как я понимаю реализация паттерна DI такова (на примере Asp Net Mvc), что есть один контейнер и в нем зарегистрированы все все все сущности. Как тогда реализовать DI в ситуации,когда у нас в DLLке есть интернальные классы, имеющие смысл внутри только этой DLLки ? Если у нас имеется лишь единый контейнер, куда мы вынуждены зарегистрировать сотню наших интернальных классов, то там свалка вообще получится да и мы тогда отдаем свои интернальные классы наружу. Неужели нужно внутри этой библиотеки организовывать свой внутренний DI что ли ? Да еще скрещивать его с внешним DI, ведь класс доступный публично придется регистрировать в обоих контейнерах. Это прям почти какой-то "containers hell" получается :) Есть какое-то решение для данной проблемы, или нету проблемы вообще ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 14:49 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ProBiotekКак тогда реализовать DI в ситуации,когда у нас в DLLке есть интернальные классы, имеющие смысл внутри только этой DLLки ? С помощью концепции модуля. Именно так и делается, даже в рамках одного приложения и нескольких DLL. Каждый модуль (каждая DLL) сама себя регистрирует в контейнере, свои зависимости. И как раз регистрируются интернальные имплементации публичных интерфейсов. Если интерфейс тоже интернальный, то за пределами модуля всё равно эту зависимость не получить. Но! Если у разработчика DI головного мозга, когда каждый чих делается через зависимость, то эту болезнь надо лечить, а не искать «решение». Желательно обходиться без DI там где это можно — максимально. Если что-то делается только внутри одного модуля и не выходит наружу, то в таких случаях лучше вообще избегать использования контейнера. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 17:34 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
hVosttНо! Если у разработчика DI головного мозга, когда каждый чих делается через зависимость, то эту болезнь надо лечить, а не искать «решение». Желательно обходиться без DI там где это можно — максимально. Если что-то делается только внутри одного модуля и не выходит наружу, то в таких случаях лучше вообще избегать использования контейнера. +100500 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 17:40 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
hVosttНо! Если у разработчика DI головного мозга, когда каждый чих делается через зависимость, то эту болезнь надо лечить, а не искать «решение». А как иначе быть ? Если не DI будет через конструктор (чаще всего) инжектить зависимости то кот ? Хардкодить создание классов по месту использования ? А как же юнит-тестирование ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 18:09 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ProBiotek, Вы конкретный пример приведите того, что за "интернальные", почему их надо инжектить, почему без этого нельзя покрыть юнит-тестами? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 19:10 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
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.
Либа которая может рассчитать медленно но точно, или быстро но не очень точно (абстрактный пример же). Внешнему миру нужен доступ к IService. Сам сервис зависит от реализаций ICalculator, о которых внешнему миру просто не интересно знать (а может даже и не нужно). Очевидно помещать создание этих классов в Service не правильно потому, что - это сильно свяжет его с этими классами. В частности ему придется знать про некие параметры someData1, someData2. - не получится протестить этот класс, передав ему мок-стаб вместо этих ICalculator. Поэтому получается, что фактически да, нужно использовать DI на каждый чих. Везде, даже во внутренних классах библиотек. Просто стало интересно как правильно конфигурировать интернальные классы в DI контейнере, создал темку. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 19:37 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ProBiotekskyANA, Ну пожалуйста. Чисто абстрактный пример. Чисто абстрактный класс вместо интерфейса + factory method - и DI в данном случае не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 03:34 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ProBiotekПоэтому получается, что фактически да, нужно использовать DI на каждый чих. Не получается. Приводить такой пример, для которого оправдано применение DI в подтверждение тезиса «на каждый чих», это как доказывать что молотком забивать гвозди — совершенно нормально. Решать конечно тебе. Но скажу сразу, за повальное применение DI где надо и где не надо, особенно в закрытых модулях как часть внутренней реализации -- по головке тебя за это не погладят. Будешь в джуниорах ходить до старческих штанов. Учись кодить правильно, включай голову! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 08:05 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ProBiotekПросто стало интересно как правильно конфигурировать интернальные классы в DI контейнере, создал темку. В модулях вместо DI, можно использовать классическую реализацию паттерна Стратегия. Возможно, тебе как раз таки не калькулятор тут нужен, а сам метод вычисления, при чём это не зависимость, а явное требование передать конкретный алгоритм для вычисления (быстрый, медленный, унылый, весёлый...). Ты явно не на том сосредоточился. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 08:09 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
[quot hVostt]ProBiotek Желательно обходиться без DI там где это можно — максимально. а можно подробнее? просто это такое максималистское заявление. не могли бы вы объяснить почему так категорично? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 11:18 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
winsky!а можно подробнее? просто это такое максималистское заявление. не могли бы вы объяснить почему так категорично? Что конкретно в этом утверждении не нравится? Давайте обсуждать не характер заявлений (то, как вам кажется), а предметно. Я могу пояснить, что за всё нужно платить. Если DI позволяет решить малой кровью некоторые проблемы в архитектуре, то злоупотребление им может нанести больше ущерба, чем пользы. Это относится к любым инструментам и методикам. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 11:23 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
hVosttwinsky!а можно подробнее? просто это такое максималистское заявление. не могли бы вы объяснить почему так категорично? Что конкретно в этом утверждении не нравится? Давайте обсуждать не характер заявлений (то, как вам кажется), а предметно. Я могу пояснить, что за всё нужно платить. Если DI позволяет решить малой кровью некоторые проблемы в архитектуре, то злоупотребление им может нанести больше ущерба, чем пользы. Это относится к любым инструментам и методикам. я не говорил, что не нравится. я сказал, что утверждение слишком громкое. я имею в виду, что я могу вообще обойтись без DI и это будет именно "максимально". и я спрашиваю очень предметно, какой вред может принести использование паттерна? т.е. - в каких случаях его применение оправданно, а в каких нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 11:27 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
winsky!я сказал, что утверждение слишком громкое. ну так и ваш комментарий можно оценить, как слишком злобное, показывающее, что вам категарически что-то не нравится, что почему-то в следующем комментарии вы также категорически отрицаете :) т.е. такой дискурс ни к чему хорошему не приведёт, суждения о суждениях. давайте лучше предметно. winsky!какой вред может принести использование паттерна? употребление DI приводит к новому уровню абстракции, и это усложняет понимание системы. если программист начинает злоупотреблять DI, то прочитать его код становится сложной задачей, а понять — ещё сложнее. стоит ли говорить, к чему это в итоге приводит? об этом хорошо написано у первоисточника, автора этого принципа Роберта Мартина. чтобы не попасть в ловушку абстракций и не создавать лишней косвенности, переусложнённого дизайна, надо изначально понимать, для чего вообще нужен DI. вы вот, сможете ответить на этот вопрос? winsky!т.е. - в каких случаях его применение оправданно, а в каких нет? если сможете ответить на мой вопрос, то он в принципе должен содержать ответ на этот. а если нет, то лучше вам обратиться к специальной литературе и попрактиковаться в реальных приложениях. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 11:46 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
эм... давайте определимся. мы говорим о dependency inversion principle или о паттерне dependency injection? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 12:38 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
hVostt, Вы тоже в своих ответах весьма абстрактны. не привели ни одного примера (а я привел) когда DI не нужен и КАК его заменить, чтобы классы остались достаточно unit-тестируемы (т.е. без тестирования всей кучей с их зависимостями). Как создавать описанные Вами стратегии и как их передавать в класс, который в них нуждается (кто или что этим будет заниматся, если не DI). Это может быть интересно. Может потом действительно можно будет взять на вооружение. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 13:24 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ProBiotekПоэтому получается, что фактически да, нужно использовать DI на каждый чих. Везде, даже во внутренних классах библиотек. Уточните пожалуйста, где в Вашем примере используется DI "во внутренних классах библиотек". ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 14:50 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
skyANA, Ну при конфигурировании IService нужно будет регистрировать его зависимости ICalculator. Потом DI их либо автоматически отрезолвит, либо мы можем сами через метод Resolve<>. Но это происходит вне указанной в примере системы. Т.е. IService должен уже получать на вход сконструированные классы. Вопрос был "привести пример внутренних классов, которые нужно конфигурировать в DI и почему их нельзя тестить без этого". Отвечаю (выше это уже написал), если конструировать ICalculator внутри IService это вынудит IService знать про некие параметры someData1, someData2. А также не позволит его нормально протестировать передав моки-стабы вместо ICalculator. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 15:18 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ProBiotek, короче hVost Вам выше уже ответил: каждая DLL сама себя регистрирует в контейнере. А пример Ваш толком ничего не показывает, уж извините :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 17:43 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
winsky!эм... давайте определимся. мы говорим о dependency inversion principle или о паттерне dependency injection? Мы говорим об DI, который в свою очередь является формой IoC в реализации. Смысл говорить о принципах не применительно к коду? Так вернёся к вопросу. Для чего нужен DI? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 18:29 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ProBiotekhVostt, Вы тоже в своих ответах весьма абстрактны. не привели ни одного примера (а я привел) когда DI не нужен и КАК его заменить, чтобы классы остались достаточно unit-тестируемы (т.е. без тестирования всей кучей с их зависимостями). Как создавать описанные Вами стратегии и как их передавать в класс, который в них нуждается (кто или что этим будет заниматся, если не DI). Это может быть интересно. Может потом действительно можно будет взять на вооружение. Я очень конкретно ответил. Примеры кода я приведу, когда вы опишете конкретную проблему. Если вы переживаете, что в контейнере слишком много зависимостей — и что лучше будет, если у каждого модуля будет свой личный контейнер — не стоит этого делать и не стоит переживать. Проблемы не существует. Паттерн Стратегия описан очень хорошо на всех языках, гуглится на раз. Зачем я буду пыжиться и демонстрировать вам свои авторские способности по описанию паттернов, если это уже давно сделано и легко доступно? Паттерн Статегия зачастую гораздо лучше решает некоторые задачи, чем DI. Скажу по секрету, есть ещё и другие архитектурные паттерны. Стоит их изучить. И у вас будет много других гораздо более интересных вопросов, чем беспокойство о количестве зависимостей в контейнере. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 18:49 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
hVostt, Паттерны я знаю, и кто такие GOF ) Вопрос был в том, как инжектить эти интернальные стратегии - суть зависимости в класс. Ну в принципе я понял Вашу идею о том, чтобы регистрировать все в одном большом контейнере. Просто подумал о том что раз есть классы internal то как это должно правильно соотносить с DI. Ладно может проблемы нету, ок. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 19:01 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ProBiotekhVostt, Паттерны я знаю, и кто такие GOF ) Разве? https://ru.wikipedia.org/wiki/Банда_четырёх «Ба́нда четырёх» (кит. трад. 四人幫, упр. 四人帮, пиньинь: Sìrén bāng, палл.: Сы жэнь бан) — термин (фактически идеологический ярлык), используемый в официальной китайской пропаганде и историографии для обозначения группы высших руководителей Коммунистической партии Китая, выдвинувшихся в ходе Культурной революции 1966—1976 годов, являвшихся наиболее приближенными к Мао Цзэдуну лицами в последние годы его жизни. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 10:28 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Ну я именно это и имел ввиду. А Вы других GOF что ли знаете еще ? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 11:39 |
|
Dependency injection. Как скрыть внутренние реализации ?
|
|||
---|---|---|---|
#18+
ProBiotekЕсли у нас имеется лишь единый контейнер, куда мы вынуждены зарегистрировать сотню наших интернальных классов, то там свалка вообще получится да и мы тогда отдаем свои интернальные классы наружу.Ну и в чём проблема? Ты всё равно из других сборок не сможешь запросить штатным способом internal-типы из контейнера, потому что компилятор выдаст ошибку. Чудеса рефлекшена не рассматриваем. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 12:27 |
|
|
start [/forum/topic.php?fid=20&fpage=57&tid=1400408]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 301ms |
total: | 461ms |
0 / 0 |