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

Enterprise Library 實戰系列(二):配置應用程式區塊——進階篇

     編輯:關於.NET

一、回應組態變更通知

區塊提供事件機制,當儲存層組態變更時通知應用程式:

1. 建立事件處理器

private void OnConfigurationChanged(object sender, ConfigurationChangedEventArgs args)
{
    Cursor = Cursors.WaitCursor;
    EditorFontData configData = ConfigurationManager.GetConfiguration("EditorSettings") as EditorFontData;
    StringBuilder results = new StringBuilder();
    results.Append("Configuration changes in storage were detected. Updating configuration.");
    results.Append(Environment.NewLine);
    results.Append("New configuration settings:");
    results.Append(Environment.NewLine);
    results.Append('\t');
    results.Append(configData.ToString());
    results.Append(Environment.NewLine);
    Cursor = Cursors.Arrow;
}

2. 註冊事件

ConfigurationManager.ConfigurationChanged += 
    new ConfigurationChangedEventHandler(OnConfigurationChanged);

二、組態資料快取

讀取 XML 後快取,再次讀取優先檢查快取。手動清除:

ConfigurationManager.ClearSingletonSectionCache();

三、進階擴展機制

1. 自訂 Storage Provider

  • 繼承 StorageProvider 實作 IStorageProviderReader/IStorageProviderWriter
  • 實作 IConfigurationProvider 時 Initialize() 不可為空
  • Read()/Write() 必須回傳 object 以支援 Transformer
public class XmlFileStorageProvider : StorageProvider, IStorageProviderWriter
{
    public override void Initialize(ConfigurationView configurationView) { /* ... */ }
    public override object Read() { /* ... */ }
    public void Write(object value) { /* ... */ }
}

2. 自訂 Transformer

  • 實作 ITransformer 需實作 Serialize()/Deserialize()
  • 實作 IConfigurationProvider 時 Initialize() 不可為空

範例:SoapSerializerTransformer(作者 Dario Fruk)

public class SoapSerializerTransformer : TransformerProvider
{
    public override void Initialize(ConfigurationView configurationView) { }
    public override object Serialize(object value)
    {
        SoapFormatter soapFormatter = new SoapFormatter();
        StringBuilder stringBuilder = new StringBuilder();
        XmlDocument doc = new XmlDocument();
        stringBuilder.Append("");
        string serializedObject = "";
        using (MemoryStream stream = new MemoryStream())
        {
            soapFormatter.Serialize(stream, value);
            byte[] buffer = stream.GetBuffer();
            serializedObject = ASCIIEncoding.ASCII.GetString(buffer).Replace('\0', ' ').Trim();
        }
        stringBuilder.Append(serializedObject);
        stringBuilder.Append("");
        doc.LoadXml(stringBuilder.ToString());
        return doc.DocumentElement;
    }
    public override object Deserialize(object section)
    {
        // ... 反序列化邏輯
    }
}

3. 內建其他 Provider

  • SQL Server Provider
  • Registry Provider

四、保護組態資訊

XML 檔案儲存不安全,可使用加密應用程式區塊加密(所有區塊組態皆可加密),詳細討論留待加密區塊篇章。

結語

進階篇涵蓋變更通知、快取、自訂 Provider/Transformer、其他 Provider。下篇將深入剖析區塊底層設計與類別架構。

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