2012-03-06 29 views
2

我有一個動態加載的類型。變量部分是從db中的xml字段讀取的。例如。確保動態加載類型的向後兼容性

class SomeClass 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public string Url {get; set;} 
} 

的名稱和URL的一部分被閱讀的

<element> 
    <name>Name</name> 
    <type>string</type> 
</element> 
<element> 
    <name>Url</name> 
    <type>string</type> 
</element> 

在類之後的XML部分池莉構建將動態加載:

class SomeClass 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public string Url {get; set;} 
    public string FallbackUrl {get; set;} 
} 

<element> 
    <name>Name</name> 
    <type>string</type> 
</element> 
<element> 
    <name>Url</name> 
< type>string</type> 
</element> 
<element> 
    <name>FallbackUrl</name> 
    <type>string</type> 
</element> 

如何向後兼容是否維護?意味着如果我稍後在課堂上進行擴展,我怎麼能保證當在較早版本的dbs上部署新版本時(有時可能是這樣)不會崩潰?

+2

您能更清楚地瞭解您所關注的情況嗎?我對版本控制DTO等非常熟悉,但你的意圖還不清楚。 – 2012-03-06 14:58:04

+0

只是爲了確保向後兼容性 - 意思是如果包含擴展類型的版本部署在較舊的數據庫上,它不會崩潰,並且只能使用較小的子集或屬性才能正常運行。 – Elena 2012-03-06 15:00:43

+0

您是否正在反序列化Xml?或者只是讀取Xml並分配值?爲了獲得最佳結果和控制,請查看MSDN上的IXmlSerializable。 – IAbstract 2012-03-06 15:01:18

回答

3

有一個讀: http://www.xfront.com/Versioning.pdf

特別(摘要):

考慮兩種情況更改爲XML模式:

案例1.新的模式改變了一些解釋元件。例如,對前一個模式有效且有意義的構造不會針對新模式進行驗證。情況2.新模式擴展名稱空間(例如通過添加新元素),但不會使先前有效的文檔無效。

用於識別新模式版本一些選項是:

  1. 變化(內部)架構版本屬性。
  2. 在根元素上創建schemaVersion屬性。
  3. 更改模式的目標名稱空間。
  4. 更改模式的名稱/位置。

XML架構版本的最佳實踐

[1]奪取架構版本某處XML架構。

[2]在實例文檔中標識與實例兼容的模式的版本/版本。

[3]使先前版本的XML模式可用。

[4]當XML架構僅用於擴展(例如,新的元素,屬性,擴展的枚舉列表,等等)一個應該努力不能否定現有實例文檔

[5]當新的模式會改變某些元素的解釋(例如,對前一個模式有效並且有意義的構造 不會根據 新模式進行驗證),應該更改目標名稱空間。