EnterpriseLibrary Configuration Facility 讓我們像使用普通組件一樣註冊資料類,透過 configurationKey 映射到 Enterprise Library 配置檔,輕鬆讀寫配置資訊。
| 屬性 | 值 |
|---|---|
| Uses Proxy | No |
| Requires Configuration | Yes |
| Uses Attributes | No |
| Version | Beta 2 |
<?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 ...>
<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>
</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>
public class EditorFontData
{
private string name; private float size; private int style;
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()
=> $"Name = {name}; Size = {size}; Style = {style}";
}
<?xml version="1.0" encoding="utf-8"?>
<EditorSettings>
<xmlSerializerSection type="ConfigurationQuickStart.EditorFontData, ...">
<EditorFontData>
<Name>Microsoft Sans Serif</Name>
<Size>9.25</Size>
<Style>0</Style>
</EditorFontData>
</xmlSerializerSection>
</EditorSettings>
public class EditorService
{
private readonly EditorFontData data;
public EditorService(EditorFontData data) { this.data = data; }
public EditorFontData Data { get { return data; } }
}
[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);
}
}
初始化時註冊 EntLibConfigurationInspector Contributor:
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);
}
}
自訂 Activator 讀寫配置:
internal class EntLibComponentActivator : AbstractComponentActivator
{
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);
}
}
至此 Facility 運作原理清晰可見。