---
title: "Как с использованием IoC-контейнера &quot;приготовить &quot;спагетти-код&quot;"
description: "Инверсия управления (Inversion of Control, IoC) — важный принцип объектно-ориентированного программи..."
author: "tarakanoffth"
published: "2011-06-13T06:03:05+00:00"
modified: "2011-06-13T06:04:40+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/kak-s-ispolzovaniem-ioc-konteynera-quot-prigotovit-quot-spagetti-kod-quot-167277"
markdown_url: "https://yvision.kz/post/kak-s-ispolzovaniem-ioc-konteynera-quot-prigotovit-quot-spagetti-kod-quot-167277/markdown"
site_name: "Yvision.kz"
---

# Как с использованием IoC-контейнера &quot;приготовить &quot;спагетти-код&quot;

> Инверсия управления (Inversion of Control, IoC) — важный принцип объектно-ориентированного программи...

**Инверсия управления** (Inversion of Control, **IoC**) — важный принцип [объектно-ориентированного программирования](http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%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), используемый для уменьшения [связанности](http://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%28%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%29) в компьютерных программах и входящий в пятерку важнейших принципов [SOLID](http://ru.wikipedia.org/wiki/SOLID_%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%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%29). ([Википедия](http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8F)).

Теперь, без лишних определений, посмотрим, как использовать IoC-контейнер в точности наоборот и, испортив архитектуру слабо-связанного кода, "приготовить "спагетти-код".

1. Перво-наперво, нужно создать сам IoC-контейнер в виде строго определенного класса. Автоматически, мы создали зависимость всего приложения от этой реализации IoC-контейнера, а реализацией может быть даже сторонний IoC-контейнер (свои собственные реализации контейнеров пишут очень редко).

2. Затем, следует зарегистрировать контейнер в самом себе (да-да!) и использовать его в конструкторах максимального количества классов.

3. Вуаля! В каждом классе, достаем из полученного в конструкторе IoC-контейнера, реализации для нужных нам интерфейсных классов.

Что мы получили в итоге? Пересыпанный приправой из IoC-контейнера спагетти-код, в котором слабой связанностью компонентов даже не пахнет и первым в этом будет виноват всё тот же IoC-контейнер.

В общем страшная реализация сервис-локаторов или синглтонов.

Теперь, попытаемся избежать участи страшного реализатора лапши из принципов ООП, а конкретно, при использовании IoC-контейнера.

1.1. Должен быть интерфейсный класс (интерфейс), который реализует работу с IoC-контейнером. И любую реализацию IoC-контейнера, мы "обворачиваем" в этот интерфейс. В результате, код приложения будет "приправлен" IoC-интерфейсом, а не конкретной реализацией IoC-контейнера.

2.1. Отвергайте любые "приправы" IoC-контейнером в конструкторах классов. Ни один класс не имеет права принимать в своем конструкторе IoC-контейнер.

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

Исключением, могут быть только классы-регистраторы, скажем в модульной системе, где подключаемый модуль, тоже хочет чего-нибудь зарегистрировать в IoC-контейнере. Но следует обязательно соблюдать пункт 1.1.

---

Source: [https://yvision.kz/post/kak-s-ispolzovaniem-ioc-konteynera-quot-prigotovit-quot-spagetti-kod-quot-167277](https://yvision.kz/post/kak-s-ispolzovaniem-ioc-konteynera-quot-prigotovit-quot-spagetti-kod-quot-167277)