---
title: "Инверсия управления (TinyIoC)"
description: "Как известно, инверсия управления, это важный принцип SOLID, позволяющий писать слабо связанный код,..."
author: "Hes"
published: "2014-10-24T04:09:01+00:00"
modified: "2014-10-24T05:14:06+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/inversiya-upravleniya-tinyioc-435569"
markdown_url: "https://yvision.kz/post/inversiya-upravleniya-tinyioc-435569/markdown"
site_name: "Yvision.kz"
---

# Инверсия управления (TinyIoC)

> Как известно, инверсия управления, это важный принцип SOLID, позволяющий писать слабо связанный код,...

Как известно, инверсия управления, это важный принцип [SOLID](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B8%D0%BD%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9), позволяющий писать слабо связанный код, повышая в разы гибкость кода.

Существует множество IoC-контейнеров (NInject, Unity, AutoFac и другие).

Для начинающих есть хорошая статья [здесь](http://habrahabr.ru/post/62830/).

Я же, в своих проектах использую [TinyIoC](https://github.com/grumpydev/TinyIoC) - небольшие размеры, и то, что его использует проект [NancyFx](http://nancyfx.org/) (Уроки по фреймворку nancy, и объяснение, что это, можно найти [тут](http://habrahabr.ru/post/197298/)).

Первая задача - нам нужно объявить контейнер и что-то в него положить.

Проект у меня простой и демонстрационный, поэтому статического контейнера мне вполне хватает.

- public static class AppContainer

- {

- private static TinyIoCContainer _instance;
- public static TinyIoCContainer Instance

- {

- get { return _instance ?? RegisterInstance(); }

- }

- private static TinyIoCContainer RegisterInstance()

- {

- var instance = new TinyIoCContainer();
- instance.Register();

- _instance = instance;
- return _instance;

- }

- }

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

Использование контейнера.

Типы, зарегистрированные в контейнере можно запросить напрямую из контейнера:
- var yviEnumerable = AppContainer.Instance.Resolve();

Либо инъекцией типа в конструктор любого класса.

На этом пока всё.

Небольшая поправка.

Что делать, если нам требуется зарегистрировать в контейнере несколько классов одного и того же интерфейса?

- instance.Register("statistic");
- instance.Register("storage");
- instance.Register("http");

Просто регистрируем:)

И резольвим список классов, зарегистрированных на один и тот же интерфейс:
- IEnumerable modules = container.ResolveAll();

---

Source: [https://yvision.kz/post/inversiya-upravleniya-tinyioc-435569](https://yvision.kz/post/inversiya-upravleniya-tinyioc-435569)