Русская Википедия:Внедрение зависимости
Внедрение зависимости (Шаблон:Lang-en) — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «инверсии управления» (Шаблон:Lang-en), когда она применяется к управлению зависимостями. В полном соответствии с принципом единственной ответственности объект отдаёт заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизмуШаблон:Sfn.
Настоящее внедрение зависимости
При использовании паттерна «внедрение зависимости» объект пассивен и не предпринимает вообще никаких шагов для выяснения зависимостей, а предоставляет для этого сеттеры и/или принимает своим конструктором аргументы, посредством которых внедряются зависимостиШаблон:Sfn.
Принцип работы
Шаблон:Нет ссылок в разделе Работа фреймворка, обеспечивающая внедрение зависимости, описывается следующим образом. Приложение, независимо от оформления, исполняется внутри контейнера IoC, предоставляемого фреймворком. Часть объектов в программе по-прежнему создается обычным способом языка программирования, часть создается контейнером на основе предоставленной ему конфигурации.
Условно, если объекту нужно получить доступ к определенному сервису, объект берет на себя обязанность по доступу к этому сервису: он или получает прямую ссылку на местонахождение сервиса, или обращается к известному «сервис-локатору» и запрашивает ссылку на реализацию определенного типа сервиса. Используя же внедрение зависимости, объект просто предоставляет свойство, которое в состоянии хранить ссылку на нужный тип сервиса; и когда объект создается, ссылка на реализацию нужного типа сервиса автоматически вставляется в это свойство (поле), используя средства среды.
Внедрение зависимости более гибко, потому что становится легче создавать альтернативные реализации данного типа сервиса, а потом указывать, какая именно реализация должна быть использована в, например, конфигурационном файле, без изменений в объектах, которые этот сервис используют. Это особенно полезно в юнит-тестировании, потому что вставить реализацию «заглушки» сервиса в тестируемый объект очень просто.
С другой стороны, излишнее использование внедрения зависимостей может сделать приложения более сложными и трудными в сопровождении: так как для понимания поведения программы программисту необходимо смотреть не только в исходный код, а еще и в конфигурацию, а конфигурация, как правило, невидима для IDE, которые поддерживают анализ ссылок и рефакторинг, если явно не указана поддержка фреймворков с внедрениями зависимостей.
Примеры кода
При использовании внедрения зависимостей, как правило, существует конфигурационный механизм или архитектура, которая определяет целесообразность выбора той или иной реализации в зависимости от поставленных целей.
См. также
Примечания
Литература
- Dependency Injection in .NET — Mark Seemann, Manning, 2011
- Внедрение зависимостей в .NET — Симан М., Питер, 2013.
- Внедрение зависимостей в .NET — Марк Симан, неофициальный перевод.
- Шаблон:Книга
Ссылки
- Inversion of Control Containers and the Dependency Injection pattern — Martin Fowler.
- Dependency Injection & Testable Objects: Designing loosely coupled and testable objects — Jeremy Weiskotten; Dr. Dobb's Journal, May 2006.
- Design Patterns: Dependency Injection — MSDN Magazine, September 2005
- Writing More Testable Code with Dependency Injection — Developer.com, October 2006 Шаблон:Wayback
- Domain Specific Modeling (DSM) in IoC frameworks
- Does Dependency Injection pay off? — InfoQ
- Dependency Injection — Dhanji R. Prasanna; Manning Publications, 2008.