Простейшим примером паттерна IoC являются функции обратного вызова в языке C. Например, вы можете объявить функцию:
void Iterator(void *list, Func* f)
которая выполняет итерации над list
, применяя функцию f
к каждому элементу. Функция Iterator
не знает, как будет обработан каждый элемент, вы просто предоставляете функцию в качестве аргумента, и она обрабатывает их.
Как показывает предыдущий пример, IoC позволяет разделить вашу программу на отдельные компоненты, которые не знают друг о друге. Одним из наиболее распространенных вариантов IoC является Dependecy Injection .
В Dependency Injection каждый компонент должен объявить список зависимостей, необходимых для выполнения его задачи. Во время выполнения специальный компонент (обычно), называемый IoC Container, выполняет связывание между этими компонентами. Он пытается предоставить значения для опубликованных зависимостей компонентов.
Вот пример в псевдокоде:
class Foo
{
<Require Boo>Constructor(Boo boo){ boo.DoSomething }
}
В этом примере класс Foo
имеет конструктор, который требует аргумент типа Boo
для выполнения некоторого действия.
Вы можете создать экземпляр класса Foo
, используя код, подобный этому:
MyContainer.Create(typeof Foo)
MyContainer
- это IoC-контейнер, который заботится о получении экземпляра Boo
и передаче его конструктору Foo
.
В целом, IoC позволяет вам разделить вашу программу на отдельные части. Это хорошо, потому что:
Однако в некоторых случаях IoC может усложнить понимание кода.
Если вы хотите увидеть хороший пример реального использования IoC, посмотрите на Mircosoft Composite UI Application Block и CompositeWPF.
Надеюсь, мое объяснение поможет вам.
С уважением,
aku
Рекомендую посмотреть эти видео для лучшего погружения в вопрос: