Как скрыть настоящую библиотеку контейнеров IoC? - PullRequest
4 голосов
/ 29 июня 2009

Я хочу изолировать весь мой код от библиотеки контейнеров IoC, которую я выбрал (Unity). Для этого я создал интерфейс IContainer, который предоставляет функции Register () и Resolve (). Я создал класс под названием UnityContainerAdapter, который реализует IContainer и оборачивает реальный контейнер. Таким образом, только сборка, в которой определен UnityContainerAdapter, знает о библиотеке Unity.

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

Есть ли у вас какие-либо предложения по решению этой проблемы?

В идеале я бы создал свой собственный атрибут [Dependency] и использовал бы его в своем коде. Но мне нужно было бы указать реальному контейнеру поиск моего атрибута вместо его собственного.

Ответы [ 3 ]

4 голосов
/ 29 июня 2009

Ознакомьтесь с проектом Common Service Locator :

Библиотека общего обслуживания содержит общий интерфейс для расположение службы, какое приложение и разработчики фреймворка могут ссылаться. Библиотека предоставляет абстракцию через IoC контейнеры и сервис локаторы. Использование библиотеки позволяет приложение для косвенного доступа к возможности, не полагаясь на жесткий Рекомендации. Надеюсь, что с помощью эта библиотека, сторонние приложения и рамки могут начать использовать IoC / Сервис Расположение без привязки сами до определенного осуществление.


Редактировать: Похоже, это не решает ваше желание использовать декларацию зависимости на основе атрибутов. Вы можете либо отказаться от его использования, либо найти способ абстрагировать атрибуты для нескольких библиотек внедрения (как вы упомянули).

Это основная проблема с декларативными интерфейсами - они привязаны к конкретной реализации.

Лично я придерживаюсь инъекции в конструктор, поэтому не сталкиваюсь с этой проблемой.

3 голосов
/ 03 июля 2009

Я нашел ответ: Unity использует расширение для настройки того, что они называют «политиками выбора». Чтобы заменить атрибуты, используемые Unity, вы просто кодируете свою собственную версию класса UnityDefaultStrategiesExtension и регистрируете свои собственные «политики выбора», которые используют ваши собственные атрибуты.

См. этот пост на сайте кодового комплекса Unity для получения подробной информации о том, как это сделать.

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

0 голосов
/ 01 июля 2009

Не могли бы вы просто настроить свою конфигурацию без атрибутов в xml. Это делает его немного «неясным», я знаю, лично я использую комбинацию xml и атрибутов, но, по крайней мере, это «решает» вашу зависимость от единства.

...