Конфигурирование контейнера IoC из модулей / плагинов? - PullRequest
2 голосов
/ 25 марта 2010

я в большой дилемме .. Я работаю над высокомодульным веб-приложением в ASP.NET MVC 2 (фактически ядро ​​будет очень легким, все работают над модулями / плагинами). Я нашел MEF довольно полезным для обнаружения модулей, но я не хочу использовать его как контейнер IoC. Вполне вероятно, что мне понадобятся расширенные функции «настоящего» контейнера IoC, поэтому я бы хотел использовать Unity.

И вот в чем проблема: как разрешить модулям настраивать контейнер (программно) = регистрировать свои собственные типы (контроллеры mvc, пользовательские реализации служб ...) при запуске приложения, не делая жесткой зависимости от Unity во всех модулях? Я знаю о проекте Common Service Locator, и он кажется довольно хорошим, но этот интерфейсный контейнер позволяет только разрешать типы, а не регистрировать их (afaik).

Я действительно надеюсь, что вы понимаете мою точку зрения, я знаю, что мой английский ужасен (я из неанглоязычной страны :) Большое спасибо!

1 Ответ

2 голосов
/ 25 марта 2010

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

Вам уже требуется, чтобы ваши надстройки использовали MEF , поэтому все они будут сильно зависеть от него. Хотя мне лично не нравится жестко закодированный подход, основанный на атрибутах, используемый MEF, похоже, вы спрашиваете, как каждая надстройка может зарегистрироваться в DI-контейнере. Для меня это звучит жестко, так что вы можете просто использовать MEF до конца.

Применение атрибутов MEF - это регистрация компонента.

Если вы действительно не хотите использовать MEF, у вас есть только несколько других вариантов (ни один из них не является особенно привлекательным):

  • Требовать, чтобы все надстройки также сильно зависели от Unity. Я полностью понимаю, почему вы не хотите этого делать, но я просто включил эту опцию для полноты
  • Требовать, чтобы все надстройки также сильно зависели от Common Service Locator. На мой взгляд, это лишь немного сдвигает проблему.
  • Определите свой собственный интерфейс регистрации надстроек , который должны быть реализованы всеми надстройками. Затем вы можете написать свою собственную реализацию, которая использует Unity, чтобы все надстройки регистрировались под этот интерфейс, но тогда вы бы более или менее просто дублировали функции MEF.
  • Напишите все надстройки в DI-дружественном, но независимом от контейнера стиле . Это оставляет проблему с настройкой DI-контейнера, и вам придется прибегнуть к конфигурации XML для этого. Это очень хрупкий подход и может быстро привести к поддержанию ада , так что еще раз я просто включаю эту опцию ради полноты.

Использование MEF для надстроек не мешает вам использовать Unity в вашем основном приложении, но я понимаю, что оно очень легкое, так что это может не иметь большого смысла.

...