<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://wikihandbk.com/ruwiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F%3A%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8</id>
	<title>Русская Википедия:Внедрение зависимости - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://wikihandbk.com/ruwiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F%3A%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8"/>
	<link rel="alternate" type="text/html" href="http://wikihandbk.com/ruwiki/index.php?title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8&amp;action=history"/>
	<updated>2026-10-11T00:25:17Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>http://wikihandbk.com/ruwiki/index.php?title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8&amp;diff=9422278&amp;oldid=prev</id>
		<title>EducationBot: Новая страница: «{{Русская Википедия/Панель перехода}} '''Внедрение зависимости''' ({{lang-en|Dependency injection, DI}}) — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «Инверсия упра...»</title>
		<link rel="alternate" type="text/html" href="http://wikihandbk.com/ruwiki/index.php?title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8&amp;diff=9422278&amp;oldid=prev"/>
		<updated>2023-08-09T17:25:29Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «{{Русская Википедия/Панель перехода}} &amp;#039;&amp;#039;&amp;#039;Внедрение зависимости&amp;#039;&amp;#039;&amp;#039; ({{lang-en|Dependency injection, DI}}) — процесс предоставления внешней зависимости &lt;a href=&quot;/ruwiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Компонентно-ориентированное программирование (страница не существует)&quot;&gt;программному компоненту&lt;/a&gt;. Является специфичной формой «Инверсия упра...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Русская Википедия/Панель перехода}}&lt;br /&gt;
'''Внедрение зависимости''' ({{lang-en|Dependency injection, DI}}) — процесс предоставления внешней зависимости [[Компонентно-ориентированное программирование|программному компоненту]]. Является специфичной формой «[[Инверсия управления|инверсии управления]]» ({{lang-en|Inversion of control, IoC}}), когда она применяется к управлению зависимостями. В полном соответствии с [[Принцип единственной ответственности|принципом единственной ответственности]] объект отдаёт заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму{{sfn|Martin|2008}}.&lt;br /&gt;
&lt;br /&gt;
== Настоящее внедрение зависимости ==&lt;br /&gt;
При использовании паттерна «внедрение зависимости» объект пассивен и не предпринимает вообще никаких шагов для выяснения зависимостей, а предоставляет для этого [[setter|сеттеры]] и/или принимает своим конструктором аргументы, посредством которых внедряются зависимости{{sfn|Martin|2008}}.&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
{{нет ссылок в разделе|дата=2013-11-13}}&lt;br /&gt;
Работа [[Фреймворк|фреймворка]], обеспечивающая внедрение зависимости, описывается следующим образом. Приложение, независимо от оформления, исполняется внутри контейнера [[Инверсия управления|IoC]], предоставляемого фреймворком. Часть объектов в программе по-прежнему создается обычным способом языка программирования, часть создается контейнером на основе предоставленной ему конфигурации.&lt;br /&gt;
&lt;br /&gt;
Условно, если [[Объект (программирование)|объекту]] нужно получить доступ к определенному сервису, объект берет на себя обязанность по доступу к этому сервису: он или получает прямую [[Ссылка (программирование)|ссылку]] на местонахождение сервиса, или обращается к известному «[[Локатор служб|сервис-локатору]]» и запрашивает ссылку на реализацию определенного типа сервиса. Используя же внедрение зависимости, объект просто предоставляет свойство, которое в состоянии хранить ссылку на нужный тип сервиса; и когда объект создается, ссылка на реализацию нужного типа сервиса автоматически вставляется в это свойство (поле), используя средства среды.&lt;br /&gt;
&lt;br /&gt;
Внедрение зависимости более гибко, потому что становится легче создавать альтернативные реализации данного типа сервиса, а потом указывать, какая именно реализация должна быть использована в, например, конфигурационном файле, без изменений в объектах, которые этот сервис используют. Это особенно полезно в [[Юнит-тестирование|юнит-тестировании]], потому что вставить реализацию «[[Mock-объект|заглушки]]» сервиса в тестируемый объект очень просто.&lt;br /&gt;
&lt;br /&gt;
С другой стороны, излишнее использование внедрения зависимостей может сделать приложения более сложными и трудными в сопровождении: так как для понимания поведения программы программисту необходимо смотреть не только в исходный код, а еще и в конфигурацию, а конфигурация, как правило, невидима для [[Среда разработки программного обеспечения|IDE]], которые поддерживают анализ ссылок и [[рефакторинг]], если явно не указана поддержка [[фреймворк]]ов с внедрениями зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
При использовании внедрения зависимостей, как правило, существует конфигурационный механизм или архитектура, которая определяет целесообразность выбора той или иной реализации в зависимости от поставленных целей.&lt;br /&gt;
&lt;br /&gt;
{{Hider hiding&lt;br /&gt;
|title=Примеры на различных языках&lt;br /&gt;
|content=&lt;br /&gt;
=== Пример кода на [[PHP]] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * Класс конфигурация базы данных&lt;br /&gt;
 */&lt;br /&gt;
class DbConfiguration&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    private $host;&lt;br /&gt;
    private $port;&lt;br /&gt;
    private $username;&lt;br /&gt;
    private $password;&lt;br /&gt;
&lt;br /&gt;
    public function __construct(string $host, int $port, string $username, string $password)&lt;br /&gt;
    {&lt;br /&gt;
        // вся суть Di находится в строчках ниже&lt;br /&gt;
        $this-&amp;gt;host = $host;&lt;br /&gt;
        $this-&amp;gt;port = $port;&lt;br /&gt;
        $this-&amp;gt;username = $username;&lt;br /&gt;
        $this-&amp;gt;password = $password;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function getHost()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;host;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function getPort()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;port;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function getUsername()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;username;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function getPassword()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;password;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Класс соединение с базой данных&lt;br /&gt;
 */&lt;br /&gt;
class DbConnection&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    private $configuration;&lt;br /&gt;
&lt;br /&gt;
    public function __construct(DbConfiguration $config)&lt;br /&gt;
    {&lt;br /&gt;
        // вся суть Di находится в строчке ниже&lt;br /&gt;
        $this-&amp;gt;configuration = $config;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function getDsn()&lt;br /&gt;
    {&lt;br /&gt;
        // примечание: это не реальный dsn, разделители в реальном dsn другие&lt;br /&gt;
        return sprintf(&lt;br /&gt;
            '%s:%s@%s:%d',&lt;br /&gt;
            $this-&amp;gt;configuration-&amp;gt;getUsername(),&lt;br /&gt;
            $this-&amp;gt;configuration-&amp;gt;getPassword(),&lt;br /&gt;
            $this-&amp;gt;configuration-&amp;gt;getHost(),&lt;br /&gt;
            $this-&amp;gt;configuration-&amp;gt;getPort()&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// создаем объект конфигурации базы данных, передавая в конструктор параметры&lt;br /&gt;
$config = new DbConfiguration('localhost', 3306, 'username', 'password');&lt;br /&gt;
// создаем объект соединения с базой, посылая в конструктор объект конфигурации&lt;br /&gt;
// использование Di дает слабосвязность кода&lt;br /&gt;
$connection = new DbConnection($config);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример кода на [[Java]] ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public interface ICar {&lt;br /&gt;
    public float getSpeed();&lt;br /&gt;
    public void setPedalPressure(final float PEDAL_PRESSURE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public interface IEngine {&lt;br /&gt;
    public float getEngineRotation();&lt;br /&gt;
    public void setFuelConsumptionRate(final float FUEL_FLOW);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Без использования dependency injection ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class DefaultEngineImpl implements IEngine {&lt;br /&gt;
    private float engineRotation = 0;&lt;br /&gt;
&lt;br /&gt;
    public float getEngineRotation() {&lt;br /&gt;
        return engineRotation;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setFuelConsumptionRate(final float FUEL_FLOW) {&lt;br /&gt;
        engineRotation = …;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class DefaultCarImpl implements ICar {&lt;br /&gt;
    private IEngine engine = new DefaultEngineImpl();&lt;br /&gt;
&lt;br /&gt;
    public float getSpeed() {&lt;br /&gt;
        return engine.getEngineRotation()*…;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setPedalPressure(final float PEDAL_PRESSURE) {&lt;br /&gt;
        engine.setFuelConsumptionRate(…);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class MyApplication {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        DefaultCarImpl car = new DefaultCarImpl();&lt;br /&gt;
        car.setPedalPressure(5);&lt;br /&gt;
        float speed = car.getSpeed();&lt;br /&gt;
        System.out.println(&amp;quot;Speed of the car is &amp;quot; + speed);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Внедрение зависимости вручную ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class DefaultCarImpl implements ICar {&lt;br /&gt;
    private IEngine engine;&lt;br /&gt;
&lt;br /&gt;
    public DefaultCarImpl(final IEngine engineImpl) {&lt;br /&gt;
        engine = engineImpl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public float getSpeed() {&lt;br /&gt;
        return engine.getEngineRotation()*…;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setPedalPressure(final float PEDAL_PRESSURE) {&lt;br /&gt;
        engine.setFuelConsumptionRate(…);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class CarFactory {&lt;br /&gt;
    public static ICar buildCar() {&lt;br /&gt;
        return new DefaultCarImpl(new DefaultEngineImpl());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class MyApplication {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        ICar car = CarFactory.buildCar();&lt;br /&gt;
        car.setPedalPressure(5);&lt;br /&gt;
        float speed = car.getSpeed();&lt;br /&gt;
        System.out.println(&amp;quot;Speed of the car is &amp;quot; + speed);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Внедрение зависимости при помощи фреймворка ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;service-point id=&amp;quot;CarBuilderService&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;invoke-factory&amp;gt;&lt;br /&gt;
            &amp;lt;construct class=&amp;quot;Car&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;service&amp;gt;DefaultCarImpl&amp;lt;/service&amp;gt;&lt;br /&gt;
                &amp;lt;service&amp;gt;DefaultEngineImpl&amp;lt;/service&amp;gt;&lt;br /&gt;
            &amp;lt;/construct&amp;gt;&lt;br /&gt;
        &amp;lt;/invoke-factory&amp;gt;&lt;br /&gt;
    &amp;lt;/service-point&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/** Неявная реализация **/&lt;br /&gt;
&lt;br /&gt;
public class MyApplication {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        Service service = (Service)DependencyManager.get(&amp;quot;CarBuilderService&amp;quot;);&lt;br /&gt;
        ICar car = (ICar)service.getService(Car.class);&lt;br /&gt;
        car.setPedalPressure(5);&lt;br /&gt;
        float speed = car.getSpeed();&lt;br /&gt;
        System.out.println(&amp;quot;Speed of the car is &amp;quot; + speed);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Замыкание (программирование)]]&lt;br /&gt;
* [[Стратегия (шаблон проектирования)]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* [http://www.manning.com/seemann/ Dependency Injection in .NET] — Mark Seemann, Manning, 2011&lt;br /&gt;
* [https://web.archive.org/web/20131109145341/http://books.piter.com/product/vnedrenie-zavisimostey-v-net-3 Внедрение зависимостей в .NET] — Симан М., Питер, 2013.&lt;br /&gt;
* [http://smarly.net/dependency-injection-in-net Внедрение зависимостей в .NET] — Марк Симан, неофициальный перевод.&lt;br /&gt;
* {{книга&lt;br /&gt;
 | автор         = Robert C. Martin&lt;br /&gt;
 | заглавие      = Clean Code: A Handbook of Agile Software Craftsmanship&lt;br /&gt;
 | издательство  = Pearson Education&lt;br /&gt;
 | год           = 2008&lt;br /&gt;
 | pages      = 157&lt;br /&gt;
 | isbn          = 978-0-13-608325-2&lt;br /&gt;
 | ref           = Martin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://www.martinfowler.com/articles/injection.html Inversion of Control Containers and the Dependency Injection pattern] — [[Фаулер, Мартин|Martin Fowler]].&lt;br /&gt;
* [http://www.ddj.com/185300375 Dependency Injection &amp;amp; Testable Objects: Designing loosely coupled and testable objects] — Jeremy Weiskotten; [[Dr. Dobb's Journal]], May 2006.&lt;br /&gt;
* [https://web.archive.org/web/20080229042522/http://msdn.microsoft.com/msdnmag/issues/05/09/DesignPatterns/default.aspx Design Patterns: Dependency Injection — MSDN Magazine, September 2005]&lt;br /&gt;
* [http://www.developer.com/net/net/article.php/3636501 Writing More Testable Code with Dependency Injection — Developer.com, October 2006] {{Wayback|url=http://www.developer.com/net/net/article.php/3636501 |date=20080311121626 }}&lt;br /&gt;
* [https://web.archive.org/web/20151118021655/http://www.pocomatic.com/docs/whitepapers/dsm/ Domain Specific Modeling (DSM) in IoC frameworks]&lt;br /&gt;
* [http://www.infoq.com/news/2007/12/does-di-pay-off Does Dependency Injection pay off? — InfoQ]&lt;br /&gt;
* [http://www.manning.com/prasanna Dependency Injection] — Dhanji R. Prasanna; [[Manning Publications]], 2008.&lt;br /&gt;
&lt;br /&gt;
{{rq|refless}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Шаблоны проектирования]]&lt;br /&gt;
[[Категория:Архитектура программного обеспечения]]&lt;br /&gt;
[[Категория:Статьи с примерами кода Python]]&lt;br /&gt;
{{Навигационная таблица/Портал/Русская Википедия}}&lt;br /&gt;
[[Категория:Русская Википедия]]&lt;br /&gt;
[[Категория:Википедия]]&lt;br /&gt;
[[Категория:Статья из Википедии]]&lt;br /&gt;
[[Категория:Статья из Русской Википедии]]&lt;/div&gt;</summary>
		<author><name>EducationBot</name></author>
	</entry>
</feed>