Настройка контейнера IoC из модулей / подключаемых модулей?

StackOverflow https://stackoverflow.com/questions/2513980

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top