區塊提供事件機制,當儲存層組態變更時通知應用程式:
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;
}
ConfigurationManager.ConfigurationChanged +=
new ConfigurationChangedEventHandler(OnConfigurationChanged);
讀取 XML 後快取,再次讀取優先檢查快取。手動清除:
ConfigurationManager.ClearSingletonSectionCache();
StorageProvider 實作 IStorageProviderReader/IStorageProviderWriterIConfigurationProvider 時 Initialize() 不可為空Read()/Write() 必須回傳 object 以支援 Transformerpublic class XmlFileStorageProvider : StorageProvider, IStorageProviderWriter
{
public override void Initialize(ConfigurationView configurationView) { /* ... */ }
public override object Read() { /* ... */ }
public void Write(object value) { /* ... */ }
}
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)
{
// ... 反序列化邏輯
}
}
XML 檔案儲存不安全,可使用加密應用程式區塊加密(所有區塊組態皆可加密),詳細討論留待加密區塊篇章。
進階篇涵蓋變更通知、快取、自訂 Provider/Transformer、其他 Provider。下篇將深入剖析區塊底層設計與類別架構。