我现在有一个使用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
答案 0 :(得分:3)
问题出在<files>
部分。由于这是由FileElementCollection
处理的,继承NamedConfigurationElementCollection
类并使用name
属性作为其键值的配置类,多个条目必须具有唯一的 name
值。
由于您指的是两次相同的name
,因此第二个条目会有效覆盖引用autofac-common
部分的第一个条目。因此,该服务永远不会被注册,只有CachingModule
。
我不能说这是否是Autofac部分的新行为,据我从源头可以看出,FileElementCollection
类是在2.0中引入的,并且从那以后没有改变逻辑。可能是你之前引用了不同的.config文件吗?