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, была актуальна, но всегда старайтесь также консультироваться с более современными источниками.
Эти главы рассматриваются в качестве стимула. Если вы еще не подобрали тот контейнер, который вам больше всего нравится, то можете прочитать эти шесть глав, чтобы сравнить все контейнеры, но можете прочитать одну или две главы, которые действительно вас интересуют.