2010-06-16 70 views
0

我正在嘗試編寫一個保持與XML文件同步的類IXmlSerializable。 XML文件的格式如下:使用C#同步類和文件之間的XML節點

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <logging> 
    <logLevel>Error</logLevel> 
    </logging> 
    ...potentially other sections... 
</configuration> 

我有一個DllConfig類整個XML文件和LoggingSection類代表<logging>及其內容,即<logLevel>DllConfig擁有此屬性:

[XmlElement(ElementName = LOGGING_TAG_NAME, 
    DataType = "LoggingSection")] 
public LoggingSection Logging { get; protected set; } 

我要的是爲後盾的XML文件進行更新(即重寫)當一個屬性設置。當已設置Logging時,我已經有DllConfig。但是,當Logging.LogLevel被設置時,我應該如何去做這件事?下面是我的意思的例子:

var config = new DllConfig("path_to_backing_file.xml"); 
config.Logging.LogLevel = LogLevel.Information; // not using Logging setter, but a 
               // setter on LoggingSection, so how 
               // does path_to_backing_file.xml 
               // have its contents updated? 

我目前的解決方案是有一個SyncedLoggingSection類,從LoggingSection繼承並在構造函數中需要DllConfig實例。它聲明一個new LogLevel,它在設置時更新基類中的LogLevel,並使用給定的DllConfig將整個DllConfig寫出到支持XML文件。這是一個很好的技術嗎?

我不認爲我可以將SyncedLoggingSection自己序列化到支持XML文件,因爲並非所有內容都將被寫入,只是<logging>節點。然後,我會最終得到一個XML文件,其中只包含<logging>部分及其更新的<logLevel>,而不是更新的整個配置文件<logLevel>。因此,我需要將DllConfig的實例傳遞給SyncedLoggingSection

看起來幾乎就像我想的事件處理程序,一個在DllConfig當特殊屬性(即LogLevel)在其屬性(即Logging)進行設置,將另行通知。這樣的事情可能嗎?

+1

莎拉,有沒有一個原因,你不只是在'System.Configuration'命名空間中使用標準類型? – 2010-06-16 19:04:58

+0

@John:你是指在Visual Studio中使用app.config和automagical Config.settings? – 2010-06-16 19:07:51

+0

我正在討論如何根據情況創建可以在app.config或web.config中使用的自定義配置節。您可以使用標準機制將更改寫回文件。請參閱文檔中的[ConfigurationManager類](http://msdn.microsoft.com/zh-cn/library/system.configuration.configurationmanager.aspx)。 – 2010-06-16 19:38:55

回答

0

由於您自己正在實施IXmlSerializable,因此可以將DllConfig.Logging設置爲私有。然後在DllConfig上添加一個公共方法來設置LogLevel,而不是直接設置Logging.LogLevel。這將是您可以更改LogLevel的唯一方法。在公共方法的實現中,可以序列化整個DllConfig來覆蓋xml。

相關問題