Конфигурация и свойства Autofac XML переопределить или предоставить, если они отсутствуют?

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

Прямо сейчас у меня есть класс с кучей основных настроек окружения (на самом деле это множество общедоступных автоматических свойств). Этот класс пытается угадать конфигурацию по умолчанию на основе некоторых параметров, но идея состоит в том, что каждая среда, в которой работает приложение, переопределяет эти параметры в конфигурации 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 2.3.2.632 для .NET 3.5.


person Aren    schedule 03.12.2010    source источник
comment
Не могли бы вы показать нам код сборки контейнера? Кроме того, какую версию Autofac вы используете?   -  person Peter Lillevold    schedule 08.12.2010
comment
@Peter Lillevold: обновлен кодом сборки контейнеров. Также включена версия autofac. Я полагаю, что с частыми изменениями autofac и последовательными критическими изменениями более важно знать версию, чем другие библиотеки :)   -  person Aren    schedule 08.12.2010
comment
О каких последовательных критических изменениях вы говорите?   -  person Peter Lillevold    schedule 09.12.2010


Ответы (1)


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

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

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

person Peter Lillevold    schedule 09.12.2010