EnterpriseLibrary Configuration Facility就好像是在容器和数据类之间的桥,让我们可以轻松得去读取和操作配置文件。熟悉Enterprise Library的人都知道,在Enterprise Library中有一个Configuration Application Block,它可以使我们方便的从各种存储中读写配置信息,通过EnterpriseLibrary Configuration Facility我们就可以像使用普通的组件那样去注册一个数据类,它会用configurationkey来映射到Enterprise Library的配置文件中。
主要内容:
1.概述
2.使用Facility
3.原理浅析
摘要:EnterpriseLibrary Configuration Facility就好像是在容器和数据类之间的桥,让我们可以轻松得去读取和操作配置文件。熟悉Enterprise Library的人都知道,在Enterprise Library中有一个Configuration Application Block,它可以使我们方便的从各种存储中读写配置信息,通过EnterpriseLibrary Configuration Facility我们就可以像使用普通的组件那样去注册一个数据类,它会用configurationkey来映射到Enterprise Library的配置文件中。
主要内容:
1.概述
2.使用Facility
3.原理浅析
一.概述
EnterpriseLibrary Configuration Facility就好像是在容器和数据类之间的桥,让我们可以轻松得去读取和操作配置文件。熟悉Enterprise Library的人都知道,在Enterprise Library中有一个Configuration Application Block,它可以使我们方便的从各种存储中读写配置信息,通过EnterpriseLibrary Configuration Facility我们就可以像使用普通的组件那样去注册一个数据类,它会用configurationkey来映射到Enterprise Library的配置文件中。先来看一下该Facility的相关信息:
Facility Information
|
Uses Proxy
|
No
|
Requires Configuration
|
Yes
|
Uses Attributes
|
No
|
Version
|
Beta 2
|
二.使用Facility
1.配置文件,这里使用配置文件注册组件的方式,放在应用程序配置文件中,这里唯一需要注意的是configurationkey,这个特性不能写错:
<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

<section name="enterpriselibrary.configurationSettings" type="System.Configuration.IgnoreSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

<section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />

</configSections>

<enterpriselibrary.configurationSettings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

defaultSection="" applicationName="Application" xmlns="http://www.microsoft.com/practices/enterpriselibrary/08-31-2004/configuration">

<configurationSections>

<configurationSection name="EditorSettings" encrypt="false">

<storageProvider xsi:type="XmlFileStorageProviderData" name="XML File Storage Provider" path="../../EditorSettings.config" />

<dataTransformer xsi:type="XmlSerializerTransformerData" name="Xml Serializer Transformer">

<includeTypes />

</dataTransformer>

</configurationSection>

</configurationSections>

<keyAlgorithmStorageProvider xsi:nil="true" />

</enterpriselibrary.configurationSettings>

<castle>

<facilities>

<facility id="configuration" type="Castle.Facilities.EnterpriseLibrary.Configuration.EnterpriseConfigurationFacility, Castle.Facilities.EnterpriseLibrary.Configuration" />

</facilities>

<components>

<component id="editorfontdata" type="ConfigurationQuickStart.EditorFontData, Castle.Facilities.EnterpriseLibrary.Configuration.Tests"

configurationkey="EditorSettings" />

<component id="editorservice" type="Castle.Facilities.EnterpriseLibrary.Configuration.Tests.EditorService, Castle.Facilities.EnterpriseLibrary.Configuration.Tests" />

</components>

</castle>

</configuration>
2.编写数据类文件:
public class EditorFontData


{
private string name;

private float size;

private int style;

public EditorFontData()

{

}

public string Name

{

get
{ return name; }


set
{ name = value; }
}

public float Size

{

get
{ return size; }


set
{ size = value; }
}

public int Style

{

get
{ return style; }


set
{ style = value; }
}

public override string ToString()

{
StringBuilder sb = new StringBuilder();

sb.AppendFormat("Name = {0}; Size = {1}; Style = {2}", name, size.ToString(), style.ToString());

return sb.ToString();
}
}
3.采用XML方式的存储
<?xml version="1.0" encoding="utf-8"?>

<EditorSettings>

<xmlSerializerSection type="ConfigurationQuickStart.EditorFontData, Castle.Facilities.EnterpriseLibrary.Configuration.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">

<EditorFontData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<Name>Microsoft Sans Serif</Name>

<Size>9.25</Size>

<Style>0</Style>

</EditorFontData>

</xmlSerializerSection>

</EditorSettings>
4.使用数据类的组件
public class EditorService


{
private readonly EditorFontData data;

public EditorService(EditorFontData data)

{
this.data = data;
}

public EditorFontData Data

{

get
{ return data; }
}
}
5.在容器中使用数据类
[TestFixture]
public class FacilityTestCase


{
[Test]
public void LoadingConfig()

{
IWindsorContainer container = new WindsorContainer( new XmlInterpreter(new AppDomainConfigSource()) );

EditorService service = (EditorService) container[ typeof(EditorService) ];

Assert.AreEqual("Microsoft Sans Serif", service.Data.Name);

Assert.AreEqual(9.25,service.Data.Size);

}

}
可以看到,使用EnterpriseLibrary Configuration Facility非常的简单。最后还要注意一点,使用这个Facility需要安装Enterprise Library,因为它依赖于:
Microsoft.Practices.EnterpriseLibrary.Common.dll

Microsoft.Practices.EnterpriseLibrary.Configuration.dll
三.原理分析
下面对这个Facility的原理做一下简单的分析。在初始化的时候,它注册了一个名为EntLibConfigurationInspector的分发器
public class EnterpriseConfigurationFacility : AbstractFacility


{
protected override void Init()

{
Kernel.ComponentModelBuilder.AddContributor( new EntLibConfigurationInspector() );

}
}

internal class EntLibConfigurationInspector : IContributeComponentModelConstruction


{
public void ProcessModel(IKernel kernel, ComponentModel model)

{
if (model.Configuration == null) return;

String configKey = model.Configuration.Attributes["configurationkey"];

if (configKey == null) return;

model.ExtendedProperties["configurationkey"] = configKey;

model.CustomComponentActivator = typeof(EntLibComponentActivator);
}
}
在EntLibConfigurationInspector中为ComponentModel注册一个CustomComponentActivator类型的Activator,这个CustomComponentActivator的实现为EntLibComponentActivator。
internal class EntLibComponentActivator : AbstractComponentActivator


{
public EntLibComponentActivator(ComponentModel model, IKernel kernel,

ComponentInstanceDelegate onCreation, ComponentInstanceDelegate onDestruction) : base(model, kernel, onCreation, onDestruction)

{

}

protected override object InternalCreate()

{
String configKey = (String) Model.ExtendedProperties["configurationkey"];

return ConfigurationManager.GetConfiguration(configKey);

}

protected override void InternalDestroy(object instance)

{
String configKey = (String) Model.ExtendedProperties["configurationkey"];

ConfigurationManager.WriteConfiguration(configKey, instance);

}
}
好了,关于EnterpriseLibrary Configuration Facility就简单的介绍到这里。
更多Castle文章可以访问:《Castle 开发系列文章》
参考资料
Castle的官方网站http://www.castleproject.org
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?