Что такое внедрение зависимостей?

Вы можете написать объект Active-X, который запускается только в Internet Explorer.

Это не exe, но это самый близкий путь к запуску exe.

2935
задан Peter Mortensen 19 March 2014 в 20:42
поделиться

5 ответов

Внедрение зависимости передает зависимость другому объекты или платформа (инжектор зависимости).

Внедрение зависимости делает тестирование легче. Инжекция может быть сделана до [1 124] конструктор .

SomeClass() имеет его конструктора как следующее:

public SomeClass() {
    myObject = Factory.getObject();
}

проблема : Если myObject включает сложные задачи, такие как доступ к диску или доступ к сети, это твердо , чтобы сделать модульный тест на SomeClass(). Программисты должны дразнить myObject, и мог бы прерывание вызов фабрики.

Альтернативное решение :

  • Передача myObject в как аргумент конструктору
public SomeClass (MyClass myObject) {
    this.myObject = myObject;
}

myObject может быть передана непосредственно, который делает тестирование легче.

  • Одна общая альтернатива определяет пустой конструктор . Внедрение зависимости может быть сделано через методы set. (h/t @MikeVella).
  • Martin Fowler документы третья альтернатива (h/t @MarcDix), где классы явно реализуют интерфейс для введенного желания программистов зависимостей.

более трудно изолировать компоненты в поблочном тестировании без внедрения зависимости.

В 2013, когда я записал этот ответ, это было главной темой на Google Testing Blog . Это остается самым большим преимуществом для меня, поскольку программистам не всегда нужна дополнительная гибкость при их разработке во время выполнения (например, для сервисного локатора или подобных шаблонов). Программисты часто должны изолировать классы во время тестирования.

1857
ответ дан Trieu Toan 20 March 2014 в 07:42
поделиться

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

, Например, рассмотрите эти классы:

public class PersonService {
  public void addManager( Person employee, Person newManager ) { ... }
  public void removeManager( Person employee, Person oldManager ) { ... }
  public Group getGroupByManager( Person manager ) { ... }
}

public class GroupMembershipService() {
  public void addPersonToGroup( Person person, Group group ) { ... }
  public void removePersonFromGroup( Person person, Group group ) { ... }
} 

В этом примере, для реализации PersonService::addManager и PersonService::removeManager был бы нужен экземпляр GroupMembershipService, чтобы сделать его работу. Без Внедрения зависимости традиционный способ сделать это состоял бы в том, чтобы инстанцировать нового GroupMembershipService в конструкторе PersonService лет и использовать тот атрибут экземпляра в обеих функциях. Однако, если у конструктора GroupMembershipService лет есть несколько вещей, это требует, или хуже все же, существует некоторая инициализация "методы set", которые нужно назвать на эти GroupMembershipService, код растет скорее быстро, и PersonService теперь зависит не только от GroupMembershipService, но также и все остальное, что GroupMembershipService зависит от. Кроме того, связь с [1 111] является hardcoded в PersonService, что означает, что Вы не можете "макет" GroupMembershipService для тестирования, или использовать стратегическую модель в различных частях Вашего приложения.

С Внедрением зависимости, вместо того, чтобы инстанцировать GroupMembershipService в Вашем PersonService, Вы или передали бы его в PersonService конструктор или иначе добавили бы Свойство (метод считывания и метод set) для установки локального экземпляра его. Это означает, что Ваш PersonService больше не должен волноваться о том, как создать GroupMembershipService, это просто принимает тех, это дано и работает с ними. Это также означает, что что-либо, что является подклассом [1 119], или реализует эти GroupMembershipService, интерфейс может быть "введен" в эти PersonService, и эти PersonService не должен знать об изменении.

254
ответ дан Mike B. 20 March 2014 в 07:42
поделиться
  • 1
    @cjrh: I' m любопытный: почему был бы Вы писать " Большой answer" но не голосуют за ответ? Никакое давление... – Ned Batchelder 29 July 2010 в 07:40

Лучшее определение, которое я нашел до сих пор, один James Shore :

"Внедрение зависимости" является термином за 25 долларов для понятия за 5 центов. [...] Внедрение зависимости означает давать объекту свои переменные экземпляра. [...].

существует статья Martin Fowler , который может оказаться полезным, также.

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

Зависимости могут быть введены в объекты многими средствами (такими как инжекция конструктора или инжекция метода set). Можно даже использовать специализированные платформы внедрения зависимости (например, Spring), чтобы сделать это, но они, конечно, не требуются. Вам не нужны те платформы, чтобы иметь внедрение зависимости. Инстанцирование и передача объектов (зависимости) явно являются столь же хорошей инжекцией как инжекция платформой.

2268
ответ дан ardila 20 March 2014 в 07:42
поделиться

Внедрение зависимости для 5 лет.

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

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

1
ответ дан 22 November 2019 в 19:47
поделиться

В простых словах, когда мы говорим, что зависимость пружиной, Это указывает, что мы создаем объекты и те объекты, зависит от некоторых других объектов

, Например: Вы хотите создать ноутбук

, Каковы вещи, в которых Вы нуждаетесь? Жесткий диск, RAM, Экран и т.д., Если ноутбук Вы создаете, имеют бренд “X”, затем необходимо одалживать различные части другим брендом (рассматривающий все Вы сборка can’t). Если Вы хотите создать объект, который зависит от другого объекта, Вы, can’t создают весь класс для этого, у нас есть различные классы.

class Laptop {
    HitachiHD obj1=new HitachiHD();
}

Это - слабая связь: Один объект не полностью зависит от другого. Так, здесь прибывает понятие абстракции —, Если мы захотим заменить Жесткий диск, то мы создадим внешний сервис, который введет контейнерный объект зависимости и введет его..

Ранее, у нас была пружина xml, если кто-то хочет объект, мы даем его в XML-файлах.

В springboot, мы не должны вручную менять имя объекта как XML-файл Spring. Здесь, мы используем и Автопроводную аннотацию Компонента для того, чтобы сделать это более слабо связанным.

@Component

class HitachiHD implements HardDrive {

}

В Laptop класс, куда мы собираемся использовать это, мы отметим его, как Автосоединено проводом

@ Autowired

HardDrive obj1;

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

-1
ответ дан 22 November 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: