Решения для реального мира с помощью Внедрения зависимости

Я читал о DI полностью, и это кажется интересным. До сих пор я полностью живу без него.

Все примеры, которые я видел, связаны с JNDI и как DI помогает Вам являющийся более гибким.

Что такое реальные приложения/проблемы, которые Вы решили с DI, который будет трудно решить другими способами?

ОБНОВЛЕНИЕ
Все ответы до настоящего времени обучают, но перефразировать вопрос, я ищу примеры в Вашей жизни программирования, которая заставила Вас сказать, что "эта проблема будет лучше всего решена с платформой DI".

21
задан mattytommo 19 March 2013 в 16:09
поделиться

8 ответов

Как раз в тот день, я решил прочитать в инъекции зависимости. До этого я только знал слово. Честно говоря, моя реакция на статью Мартина Фуэлера была: «Это так?»

Я должен согласиться с Джеймсом Берегом :

«Инъекция зависимости» - это 25-доллар Срок для концепции 5 центов.

Это совсем не означает, что это плохое понятие . Но, серьезно, когда экземпляр A должен работать с другим экземпляром b , он доходит до этих вариантов:

  1. Пусть A Найти B :

    Это означает B , должно быть глобальным. Зло.

  2. Пусть Создание b :

    тонко, если только нуждается в b . Как только C также необходимо B , заменить A на C в этом списке. Обратите внимание, что тестовый случай будет C , поэтому, если вы хотите проверить, этот выбор ушел также.

  3. Дайте B на A :

    , это впрыск зависимости.

Я что-то упускаю? (Обратите внимание, что я из мира Python, так что, возможно, есть языковые конкретные точки, которые я не вижу.)

24
ответ дан 29 November 2019 в 20:35
поделиться

Я использую инъекцию зависимости для тестирования все время. Это также чрезвычайно полезно, когда у вас есть куча больших систем, которые вы не хотите напрямую связать вместе (чрезвычайно свободная муфта).

Если вы используете Java, я бы порекомендовал Google Google , так как он так уютно. Для C ++ рекомендую QT IOC . Для .NET, проект проекта замка обеспечивает хорошую систему IOC. Существует также весенняя реализация в основном везде, но это скучно.

4
ответ дан 29 November 2019 в 20:35
поделиться

DI позволяет создавать приложения, которые можно настроить и перенастроить, не касаясь самой кодовой базы. Не только URL или настройки; Общие объекты могут быть написаны в коде, а затем «настроить» или настраиваются через XML-файлы для достижения конкретного результата, желаемого для данного случая.

Например, я могу создать класс Regeexdetective, где фактическое регулярное выражение, которое он ищет, предоставляется в установке, а затем в моем файле Spring di XML определяет одно фактическое выражение Regex для RegexDetective.Setregex () для развертывания внутри собираюсь в Лондон. Затем через несколько дней я могу вернуться и обновить Regex в файле XML для другого развертывания доставки в SleuthApp в Сибири.

di также позволяет определить конкретные реализации интерфейсов аналогичным образом, снаружи кодовой базы в XML, для изменения поведения приложения, не касаясь кода, такого как настроить Angrydetectective или ArctiCdetectective Desertive Interface, в файле di xml.

3
ответ дан 29 November 2019 в 20:35
поделиться

Вы можете прочитать эту статью «Хотите скорость? Пройти по значению» о копировании ELINISE и RVO (возврат по оптимизации стоимости). Это объясняет, что ссылки иногда предотвращают их делать компилятора.

-121--3242480-

У нас есть мультимедийный сервис для разных стран. Мы запускаем тот же код для всех, но иногда бизнес-правила отличаются от одной страны к другой. В этом случае мы вводим разные пружины MVC перехватчик для одного клиента или для другого.

Затем в этапе развертывания скрипт «выбирает», который требуется di файл, основанный на последних буквах файлов ( fr для Франции, CH для Швейцарии и т. Д. ...)

  • Application-Context.xml-fr
  • Application-context.xml-ch
  • etc ...

Это единственное хорошее использование, которое я вижу в DI. Я не фанат ди, хотя.

2
ответ дан 29 November 2019 в 20:35
поделиться

Я использовал контейнер IOC IOC (DI) для последних трех веб-приложений, которые я разработал. Я не думаю, что он подходит для одного конкретного типа проблемы, скорее это другой способ решения проблемы. Это как ты сказал, более гибкий подход к крупным системам. Мои личные любимые функции di состоят в том, что вы можете подготовить лучшие тесты на единицу, потому что ваши классы сильно отделены. Также важно для меня - повторное использование кода. Поскольку я использую контейнер во многих приложениях, я могу использовать те же компоненты и знать, что их зависимости будут подаваться внешне.

1
ответ дан 29 November 2019 в 20:35
поделиться

В большом многомодульных приложениях с использованием Di, модуль зависит только от интерфейсов на сотрудничестве его классов, которые вырезывают графики зависимости времени компиляции .

В контексте структуры (вызов «Ваш» функциональный код, в отличие от функционального кода, вызывающего библиотеку), это требуется. Ваш код может иметь компиляция зависимостей в рамках, но все мы знаем, что структура (из ваших рук) не может иметь скомпилируемых зависимостей к вашему коду; -)

0
ответ дан 29 November 2019 в 20:35
поделиться

Я использую Di в первую очередь для простоты тестирования. Кроме того, оно способствует модели окубированию ваших сервисных вызовов, чтобы обеспечить изоляцию и возможность реализации независимо от разработки услуг.

0
ответ дан 29 November 2019 в 20:35
поделиться

Вчера я нашел мобильный телефон в автобусе. Человек, потерявший его, не имел никакого ключа о человеке, обладающем ее мобильком. Я позвонил ее папу и сказал ему, что у меня есть мобильная дочь. Поэтому я ввел зависимость от меня в него. Как правило, случай голливудского принципа «не звонишь нам (потому что не могу!), Мы называем вас». Позже он пришел и поднял свой телефон дочерей.

Я бы назвал тем, что реальная проблема с миром, которую я решал впрыском зависимости, не так ли?

На мой взгляд, ди не так, чтобы решить проблемы, для которых у нас не было бы другого решения. Фабрики могут быть еще одним способом решения таких проблем. Таким образом, нет реального ответа на ваш вопрос, потому что DI просто один из способов кроме других. Это просто довольно бедра, хотя очень элегантный путь.

Мне очень понравилось ди, когда у меня был этот даос, который нуждался в SQLMAPPER. Мне просто пришлось вводить различные материалы в тестическую клавишу один раз, а остальное было сделано конфигурацией. Сохранил меня много времени и логи, но я до сих пор не могу назвать эту проблему, для которой нет другого решения.

7
ответ дан 29 November 2019 в 20:35
поделиться