Внедрение зависимости () — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «инверсии управления» (), когда она применяется к управлению зависимостями. В полном соответствии с принципом единственной ответственности объект отдаёт заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму.
Настоящее внедрение зависимости При использовании паттерна «внедрение зависимости» объект пассивен и не предпринимает вообще никаких шагов для выяснения зависимостей, а предоставляет для этого сеттеры и/или принимает своим конструктором аргументы, посредством которых внедряются зависимости.
Принцип работы
Работа фреймворка, обеспечивающая внедрение зависимости, описывается следующим образом. Приложение, независимо от оформления, исполняется внутри контейнера 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 Domain Specific Modeling (DSM) in IoC frameworks Does Dependency Injection pay off? — InfoQ Dependency Injection — Dhanji R. Prasanna; Manning Publications, 2008.
Категория:Шаблоны проектирования Категория:Архитектура программного обеспечения Категория:Статьи с примерами кода Python