Есть много способов снять шкуру с кошки;похоже, что вы принимаете неправильный подход, однако.Точка входа приложения (Global.asax или Program.cs) обязательно должна быть тем местом, где выбираются компоненты, которые нужно настроить в контейнере IoC.С другой стороны, ваши службы, как правило, не должны иметь каких-либо знаний о конфигурации IoC.Я предполагаю, что вы уже придерживаетесь этого принципа, но пересматриваете его из-за повторяющейся конфигурации.
Чтобы сделать это возможным без повторения кода, как вы описали, многие контейнеры IoC предоставляют конструкции модульности, которые инкапсулируют конфигурациюиз набора связанных компонентов.В Autofac (и Ninject IIRC) они называются «модулями» - http://code.google.com/p/autofac/wiki/StructuringWithModules. Castle Windsor называет их «установщиками», а StructureMap называет их «реестрами».
С учетом конфигурации модулей количествоКод конфигурации в методе запуска приложения уменьшен.В вашем примере для упрощения вы можете создать три модуля:
- CoreModule
- WebModule
- ServiceProcessModule
CoreModule будетсодержать конфигурацию для компонентов, которые являются общими и ведут себя одинаково в каждой из сред выполнения.
WebModule и ServiceProcessModule будут содержать регистрации для компонентов, специфичных для этих сред, а также специализированную конфигурацию любых общих компонентов, которые настраиваются по-разному в зависимости отthe host.
Тогда запуск вашего веб-приложения будет выглядеть примерно так:
foo.RegisterModule<CoreModule>();
foo.RegisterModule<WebModule>();
// Resolve root component, run app
Хотя процесс обслуживания будет очень похожим, но заменит WebModule для ServiceProcessModule.
Этот стильконфигурации будет гораздо лучше масштабироваться для многих точек входа приложений и / или многих подсистем компонентов, по сравнению с методом статической инициализации с условным кодом.
Надеюсь, это поможет.Ник