[英]How to handle multiple XML versions gracefully
我有一個從訂購消息開始的場景。 隨着時間的流逝,消息可能會被修改(分為不同的版本)。 什么是查看消息的版本並將其傳遞給適當的處理機制的好方法? 我可以看一下版本(始終會有一個帶有版本信息的標頭,等等),然后使用一種情況將其發送到適當的解析器(當前使用LINQ to XML)。 但是,這似乎不是很優雅。 特別是如果我們有10個版本需要支持。
什么都沒冒出來……我只是想看看別人會怎么做。
如果您有X版本的架構,則需要X代碼路徑來處理它們。
要選擇實現,您將必須在某處有一個switch語句。 該開關可以簡單地調用方法,也可以在工廠方法中返回正確的解析器(類或委托)。
這並不妨礙您在版本之間共享部分代碼,並且將解析分解為各個組成部分以支持這一點是一個好主意。 您可以通過類或方法將其分解。
您可能有一個通用的基本接口來開始解析任何版本,並獲取XML表示的對象圖。 理想情況下,生成的對象模型應盡可能獨立於版本,以便您可以共享通用功能。
或者,您可以使用XSLT升級數據,並且僅使用一個解析器。
您可以為每個版本實施一次並鏈接所有轉換,也可以直接轉換為最新版本並在每個發行版中修改先前版本的轉換。
鏈接轉換具有更好的維護成本。 直接轉換具有更好的性能。
您仍然需要一個開關:)
如果您的版本是數字,則可能會有類似公共接口的命令IOrderMessageHandler {void Handle(OrderMessage message); }
public class OrderMessageHandlerVersion123 : IOrderMessageHandler { ... }
具有命名約定並使用反射來構造它們:
var handler = (IOrderMessageHandler)Activator.CreateInstance( GetType().Assembly.GetType("MyNamespace.OrderMessageHandlerVersion" + message.Version));
handler.Handle(message)
一種替代解決方案是使用一組xslt腳本,這些腳本會將xml的舊版本轉換為最新版本(通過順序應用腳本以將N-1版本轉換為N版本)。 在這種情況下,您將只有一個“處理機制”,該機制僅支持XML的最新版本。
處理機制如下所示:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.