首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Castle IOC 實踐:EnterpriseLibrary Configuration Facility

     編輯:關於.NET

概述:容器與資料類之間的橋樑

EnterpriseLibrary Configuration Facility 讓我們像使用普通組件一樣註冊資料類,透過 configurationKey 映射到 Enterprise Library 配置檔,輕鬆讀寫配置資訊。

Facility 基本資訊

屬性值
Uses ProxyNo
Requires ConfigurationYes
Uses AttributesNo
VersionBeta 2

使用步驟

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 ...>
    <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>

2. 資料類

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}";
}

3. XML 儲存檔

<?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>

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);
    }
}

依賴組件

  • Microsoft.Practices.EnterpriseLibrary.Common.dll
  • Microsoft.Practices.EnterpriseLibrary.Configuration.dll

原理淺析

初始化時註冊 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 運作原理清晰可見。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved