Главная страница   /   14.5. Резюме (Внедрение зависимостей в .NET

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

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

Марк Симан

14.5. Резюме

Unity – это DI-контейнер, разрабатываемый группой Patterns&Practices компании Microsoft. Несмотря на то, что он не является как таковым решением компании Microsoft, многие организации, занимающиеся разработкой приложений, все еще считают его некоторого рода полуофициальным продуктом компании Microsoft. Теми компаниями, которые строго соблюдают принцип использования только продуктов компании Microsoft, этот факт может восприниматься как преимущество, поскольку в Unity часто входят модули приложений группы Patterns&Practices. Вторым фактором, влияющим на их выбор, является наличие официальной документации.

API, предлагаемое контейнером Unity, является постоянным, но, в отличие от большинства других контейнеров, не гибким. Иногда это может приводить к усложнению проверки, но как только вы поймете суть контейнера Unity, вы сможете оценить его постоянность: за исключением необязательных имен и LifetimeManager'ов, вся дальнейшая конфигурация выполняется с помощью классов, унаследованных от абстрактного класса InjectionConstructor.

Помимо императивного API контейнер Unity также обладает комплексной XML-схемой, которая позволяет определять конфигурацию контейнера как в XML, так и в коде. С другой стороны, он не поддерживает основанный на соглашениях механизм автоматической регистрации.

Unity – один из тех относительно немногих DI-контейнер'ов, которые поддерживают механизм перехвата. Эта поддержка обеспечивается за счет расширения основного контейнера, но при этом является частью модуля приложений.

Одной из относительно слабых сторон контейнера Unity является механизм управления жизненным циклом. Несмотря на то, что встроенные стили существования кажутся вполне достаточным набором стилей, управление ресурсами становится довольно трудным процессом, поскольку после прекращения использования компоненты не высвобождаются должным образом. К счастью, не все так уж плохо, поскольку мы можем реализовать пользовательские стили существования, которые будут решать эти проблемы. Получается, что управлять жизненными циклами в рамках контейнера Unity достаточно сложно, но вполне возможно.

В общем Unity является довольно добротным DI-контейнер'ом. Он имеет свои слабые стороны, но, с другой стороны, предоставляет довольно полный набор возможностей. Единственная важная упущенная возможность – автоматическая регистрация, но поскольку API контейнера Unity является открытым, при желании его можно усовершенствовать.

Эта глава познакомила нас с полуофициальным DI-контейнер'ом компании Microsoft. В следующей главе мы рассмотрим контейнер, слегка отличающийся от контейнера Unity. Некоторые вообще не считают его DI-контейнер'ом. С другой стороны, он входит в состав стандартной библиотеки классов .NET 4 и имеет множество схожих с DI-контейнер'ами черт. Поэтому стоит все-таки рассмотреть Managed Extensibility Framework (MEF – управляемая платформа расширений).