Autofac XML配置&属性覆盖或提供,如果不存在?

时间:2010-12-03 00:14:34

标签: c# .net configuration autofac

我现在有一个使用Autofac的应用程序。在加载模块后,我已经构建了autofac来从配置文件注册。(对于基于xml的默认行为覆盖)。

现在我有一个基本环境设置的课程(真的有很多公共自动属性)。此类尝试根据某些设置猜测默认配置,但想法是应用程序运行的每个环境都会覆盖xml配置中的这些设置。

这是我的问题:

在这个系统的开发早期,事情是桃红色的。 现在它似乎完全忽略了XML Configs的输入。我不确定是什么改变导致它被打破,所以我希望有人可以指出一些明显的我做错了。

我已经验证配置文件是由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

1 个答案:

答案 0 :(得分:3)

问题出在<files>部分。由于这是由FileElementCollection处理的,继承NamedConfigurationElementCollection类并使用name属性作为其键值的配置类,多个条目必须具有唯一的 name值。

由于您指的是两次相同的name,因此第二个条目会有效覆盖引用autofac-common部分的第一个条目。因此,该服务永远不会被注册,只有CachingModule

我不能说这是否是Autofac部分的新行为,据我从源头可以看出,FileElementCollection类是在2.0中引入的,并且从那以后没有改变逻辑。可能是你之前引用了不同的.config文件吗?