2009-09-14 3 views
1

Я пытаюсь создать библиотеки инфраструктуры для своей компании. Библиотеки будут иметь типичные компоненты, такие как ведение журнала, обработка исключений, электронная почта и т. Д. Эти компоненты будут использоваться всеми приложениями ASP.Net, размещенными в нашей среде (так что среда хостинга - это мой контроль).Один контейнер для нескольких приложений ASP.Net

Мой первый шаг в дизайне заключается в том, что я бы не хотел, чтобы приложения ASP.nEt имели прямую ссылку на библиотечные компоненты. Поэтому я собираюсь внедрить эти dependecies во время выполнения. Я оценил довольно много контейнеров DI (единство, spring.net и т. Д.)

Но мне не нужно делать все, чтобы приложения ASP.Net использовали этот контейнер DI. Они получат интерфейс Dll для всех компонентов библиотеки и некоторую фабричную dll, которая даст им конкретный экземпляр компонента.

Мой вопрос заключается в том, как наилучшим образом спроектировать эту фабричную dll, чтобы только одна DLL могла обслуживать все приложения ASP.Net? Могу ли я использовать один контейнер DI для обслуживания всех приложений ASP.Net?

ответ

1

Ну, вы могли бы просто определить интерфейс контейнера, как это:

public interface IContainer 
{ 
    T Resolve<T>(); 
} 

(очевидно, вы можете добавить больше методов, если вам нужно). Затем вы можете создать конкретную реализацию этого интерфейса IContainer на основе вашего контейнера DI по выбору.

Такие конкретные реализации могут инкапсулировать всю конфигурацию, необходимую вашему приложению в отношении зарегистрированных компонентов.

Ваши приложения ASP.NET просто будут использовать интерфейс IContainer и вызвать метод Resolve для получения экземпляров необходимых компонентов.

+0

Спасибо за ответ Марк ... Думаю, я не поставил свой вопрос правильно. Моя проблема заключается не в том, что у меня есть несколько контейнеров DI, из которых можно решить. У меня будет только один контейнер DI. Моя проблема с электронной почтой заключается в том, как этот контейнер DI будет использоваться несколькими приложениями ASP.Net. Больше похоже на Single DI Container (один класс обертки над контейнером DI) ... Я надеюсь, что это имеет смысл, или если нет, это нормально, чтобы каждое приложение ASP.Net создавало значение класса оболочки и контейнер DI заботился о создание компонентов библиотеки. – rauts

+0

@rauts: Тогда почему бы вам просто не создать экземпляр выбранного контейнера непосредственно в global.asax (или в подобном месте)? Вот и вся идея ... –

+0

@rauts: Взгляните на этот SO-ответ, который объясняет, что я имел в виду под моим предыдущим комментарием: http://stackoverflow.com/questions/1410719/design-where-should-objects-be- зарегистрированный-при использовании-windsor/1410738 # 1410738 –

Смежные вопросы