Главная страница   /   3. DI-контейнеры (Внедрение зависимостей в .NET

Внедрение зависимостей в .NET

Внедрение зависимостей в .NET

Марк Симан

3. DI-контейнеры

Меню:

  • XML конфигурация
  • Использование кода в качестве конфигурации
  • Автоматическая регистрация
  • Composition Root
  • Паттерн Register Resolve Release

Когда я был еще совсем ребенком, мы с мамой изредка готовили мороженое. Мы не делали это слишком часто, поскольку приготовление мороженого было трудоемким процессом, и очень сложно было получить в итоге настоящее мороженое. В случае если вы никогда не пробовали делать мороженое, рисунок 3-1 иллюстрирует процесс его приготовления.

Рисунок 3-1: Приготовление мороженого – трудоемкий процесс, включающий множество возможностей для совершения ошибок

Настоящее мороженое делается на кремовой основе, которая представляет собой легкий заварной крем, приготовленный из сахара, яичных желтков и молока или крема. Если перегреть эту смесь, то она будет сворачиваться. Если даже вам удалось этого избежать, следующая фаза приготовления несет за собой еще больше проблем. Если оставить кремовую смесь в морозилке и не трогать ее, то она будет кристаллизоваться, поэтому вам придется регулярно ее помешивать до тех пор, пока она не станет максимально густой. Только после этого вы получите хорошее, приготовленное в домашних условиях мороженое.

Несмотря на то, что приготовление мороженого – это медленный и трудоемкий процесс, если вы все же хотите его приготовить, и у вас есть все необходимые ингредиенты и оборудование, то вы можете воспользоваться выведенной мной технологией приготовления мороженого.

Сегодня, около 30 лет спустя, моя тёща делает мороженое с периодичностью, несравнимой с той, с которой мы с мамой делали мороженое в более юные годы – не потому что она любит делать мороженое, но потому что она пользуется технологией, которая ей помогает. Техника остается все той же, но вместо того, чтобы постоянно доставать мороженое из морозилки и перемешивать его, она пользуется электрической мороженицей, которая выполняет это за нее (см. рисунок 3-2).

Рисунок 3-2: Итальянская мороженица моей тещи

Механизм внедрения зависимостей – это первая и самая главная технология, но вы можете воспользоваться техническими средствами для облегчения процесса. В части 3 я буду описывать DI как технологию. Затем в части 4 мы рассмотрим технические средства, которые могут использоваться для поддержания технологии DI. Мы называем эти средства DI-контейнерами.

В этой главе мы рассмотрим DI-контейнеры как сущность: как они вписываются во всеобщую картину механизма внедрения зависимостей, рассмотрим некоторые паттерны и технологии, предусматривающие их использование, а также рассмотрим некоторые исторические факты, касающиеся DI. Попутно мы рассмотрим некоторые примеры.

Основной план-конспект главы проиллюстрирован на рисунке 3-3. Глава начинается с общего введения к DI-контейнерам, включая описание сущности под названием автоматическая интеграция, за которым следует раздел с описанием различных опций конфигурации. Вы можете читать о каждой из этих опций в отдельности, но думаю, было бы выгоднее, по крайней мере, прочитать о такой опции, как использование кода в качестве конфигурации, прежде чем читать об автоматической регистрации.

Рисунок 3-3: Структура этой главы. Раздел "Перспектива DI-контейнеров" не является обязательным для прочтения

Центральный раздел этой главы – это мини-каталог паттернов проектирования, называемых DI-контейнеры. Несмотря на то, что этот раздел руководствуется форматом каталога, описание паттерна Register Resolve Release (RRR) опирается на описание паттерна Composition Root, поэтому имеет смысл читать их последовательно. Вы можете пропустить раздел об опциях конфигурации и перейти прямо к описанию паттернов, но эти разделы лучше читать по порядку.

Последний раздел отличается от предыдущих. Он намного менее технический и фокусируется на том, как DI-контейнеры вписываются в экосистему .NET. Вы можете пропустить этот раздел, если вам не важен этот аспект.

Цель главы – предоставить вам хорошее понимание того, что такое DI-контейнер, и как он сочетается со всеми остальными паттернами и принципами данной книги; в некотором смысле, вы можете рассматривать эту главу как введение к части 4 данной книги. В ней мы будем говорить о DI-контейнерах в широком смысле, тогда как в части 4 мы будет говорить о конкретных контейнерах и их API.

Может показаться несколько странным то, что мы ведем разговор о DI-контейнерах здесь, в главе 3, а потом более или менее забываем о них на протяжении следующих шести глав, но для этого есть причина. В этой части книги я хочу обрисовать огромную картину механизма внедрения зависимостей, и важно, чтобы вы понимали, как DI-контейнеры вписываются в эту схему. В части 2 и 3 я изредка буду демонстрировать вам некоторые примеры, в которые входит DI-контейнер, но в большинстве случаев я, в основном, буду придерживаться рассуждений. Принципы и паттерны, описанные в середине книги, могут быть применимы ко всем DI-контейнерам.

3.1. Знакомство с DI-контейнерами

3.2. Конфигурирование DI-контейнеров

3.3. Паттерны DI-контейнеров

3.4. Перспектива DI-контейнеров

3.5. Резюме