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

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

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

Марк Симан

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

Предыдущие части этой книги были посвящены разнообразным принципам и паттернам, которые совместно определяют механизм внедрения зависимостей. Как объяснялось в главе 3, DI-контейнер – это необязательный инструмент, который можно использовать для реализации большого количества общецелевой инфраструктуры, которую вам пришлось бы реализовать иным образом, если бы вы использовали Poor Man's DI.

На протяжении всей книги я стремился по возможности сохранять ее, независимой от контейнеров. Не принимайте это в качестве рекомендации Poor Man's DI; наоборот, я хотел, чтобы вы увидели механизм внедрения зависимостей в его истинной форме, незапятнанным API какого-либо конкретного контейнера (возможно, необычным).

Есть небольшая причина того, чтобы потратить свое время на изучение Poor Man's DI, так как в .NET доступны многие превосходные DI-контейнеры. В данной части 4 представлен набор из 6 конкретных бесплатных контейнеров. В каждой главе я предоставляю детальный обзор API конкретного контейнера, как он относится к масштабам, охватываемым в части 3, а также другие разнообразные проблемы, которые являются причинами бед начинающих разработчиков.

В части 4 рассматриваются такие контейнеры, как Castle Windsor, StructureMap, Spring.NET, Autofac, Unity и MEF. Существуют и другие фреймворки контейнеров, которые я, по той или иной причине, не включил в данную книгу: Ninject, Hiro, Funq, LinFu, OCInject и т.д. Пожалуйста, обратите внимание на то, что содержание данной книги само по себе не является предвестником одобрения. Несмотря на то, что многие из включенных в эту книгу DI-контейнеров обладают превосходным качеством, это не было единственным критерием отбора. Существуют конкретные контейнеры, которые я не включил в эту книгу всего лишь по причине той доли, в которой они представлены на рынке. Между тем я решил описать остальные, поскольку они обеспечивают отличный контраст благодаря их различным философиям проектирования и целям. Это также означает, что мне пришлось исключить некоторые превосходные контейнеры. Мне, конечно, хотелось бы включить в эту книгу все DI-контейнеры, но, увы, поскольку мое пространство ограниченно, это не возможно.

Каждая глава руководствуется общим шаблоном. Чтение одного и того же предложения по 6 раз может дать вам определенное ощущение дежавю, но я считаю это достоинством, поскольку такая структура глав должна дать вам возможность быстро находить аналогичные разделы в рамках разных глав, если вы захотите сравнить, как конкретная деталь раскрывается в рамках двух или более контейнеров. Для быстрого сравнения обращайтесь к следующей таблице:

DI-контейнер Достоинства Недостатки
Castle Windsor Завершенность

Понимает Decorator

Типизированные фабрики

Доступно коммерческое сопровождение
Местами извилистое API
StructureMap Просто работает в большинстве случаев Не поддерживает механизм перехвата
Spring.NET Механизм перехвата

Исчерпывающая документация

Доступно коммерческое сопровождение
Очень завязан на XML

Не подерживает API, основанное на соглашениях

Не поддерживает пользовательские жизненные циклы

Ограниченные возможности автоматической интеграции
Autofac Простое для изучения API

Доступно коммерческое сопровождение
Не поддерживает механизм перехвата

Частично поддерживает пользовательские жизненные циклы
Unity Механизм перехвата

Хорошая документация

Неизменное API
Небольшие возможности управления жизненным циклом

Не подерживает API, основанное на соглашениях
MEF Доступен в .NET 4/Silverlight 4 BCL

Коммерческое сопровождение
Не настоящий DI-контейнер

Конфигурация, основанная на статических атрибутах

Не поддерживает XML

Не поддерживает технологию использования кода в качестве конфигурации

Не подерживает API, основанное на соглашениях

Не поддерживает пользовательские жизненные циклы

Не поддерживает механизм перехвата

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

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

10. Castle Windsor

11. StructureMap

12. Spring.NET

13. Autofac

14. Unity

15. MEF