2010-12-03 4 views
4

У меня есть приложение, использующее Autofac в настоящий момент. Я сконструировал автозапуск для регистрации из конфигурационного файла после, в который загружены модули. (Для переопределения поведения по умолчанию на основе xml).Конфигурация и свойства конфигурации Autofac Переопределить или предоставить, если нет?

Прямо сейчас у меня есть класс с множеством основных настроек окружающей среды (на самом деле множество общественных авто-свойств). Этот класс пытается угадать конфигурацию по умолчанию, основанную на некоторых настройках, но идея состоит в том, что каждая среда, в которой работает приложение, переопределит эти параметры в конфигурации xml.

Вот моя проблема:

Ранее в развитии этой системы, все было радужно. Теперь, похоже, полностью игнорирует ввод XML-конфигураций. Я не уверен, что изменилось, что заставило это сломаться, поэтому я надеюсь, что кто-то может указать на что-то очевидное, я поступаю неправильно.

Я проверил, что файл конфигурации считывается/анализируется с помощью autofac, просто не применяется.

web.config:

<autofac> 
    <files> 
    <file name="Config/Environment.config" section="autofac-common" /> 
    <file name="Config/Environment.config" section="autofac-public" /> 
    </files> 
</autofac> 

Environment.config:

<configuration> 
    <configSections> 
    <section name="autofac-common" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/> 
    <section name="autofac-public" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/> 
    </configSections> 

    <!-- Common --> 
    <autofac-common> 
    <components> 
     <component type="MyApp.Web.Configuration.ServerConfiguration, MyApp.Web" 
      service="MyApp.Web.Configuration.IServerConfiguration, MyApp.Web"> 
     <properties> 
      <property name="Host" value="beta.mysite.com" /> 
      <property name="MediaHost" value="beta.media.mysite.com" /> 
     </properties> 
     </component> 
    </components> 
    </autofac-common> 
    <!-- Web Site --> 
    <autofac-public> 
    <modules> 
     <module type="MyApp.Configuration.CachingModule, MyApp"> 
     <properties> 
      <property name="Disable" value="true" /> 
     </properties> 
     </module> 
    </modules> 
    </autofac-public> 
</configuration> 

Контейнер строительный кодекс

var builder = new ContainerBuilder(); 

    // Register Identifier so it's available to modules 
    builder.RegisterType<ServerIdentifier>() 
     .As<IServerIdentifier>() 
     .SingleInstance(); 
    var container = builder.Build(); 

    builder = new ContainerBuilder(); 
    builder.RegisterModule(new CachingModule() { Disable = true }); 
    builder.RegisterModule(new LoggerModule()); 
    builder.RegisterModule(new InventoryModule()); 
    builder.RegisterModule(new CatalogModule()); 
    builder.RegisterModule(new WebModule(container)); 

    // Override with settings from XML 
    builder.RegisterModule(new ConfigurationSettingsReader("autofac")); 

    builder.Update(container); 

Autofac Version is 2.3.2.632 Для .NET 3.5

+0

Не могли бы вы показать нам контейнерный код? Кроме того, какую версию Autofac вы используете? – 2010-12-08 11:42:24

ответ

3

Проблема в вашем разделе <files>. Поскольку это обрабатывается FileElementCollection, класс конфигурации наследуя NamedConfigurationElementCollection класс и используя name свойство как ключевое значение, несколько записей должны иметь уникальныхname значения.

Поскольку вы ссылаетесь на тот же name дважды, первая запись, относящаяся к разделу autofac-common, фактически перезаписывается второй записью. Таким образом, сервис никогда не будет зарегистрирован, только CachingModule.

Я не могу сказать, было ли это новое поведение на стороне Autofac или нет, насколько я могу судить по источнику, класс FileElementCollection был введен в 2.0 и с тех пор не изменил логику. Может быть, вы ранее ссылались на разные файлы .config?

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