我有一个场景,我开始使用订单消息。随着时间的推移,可以修改消息(到不同的版本)。查看消息的版本并将其传递给适当的处理机制会有什么好方法?我可以查看版本(将始终有一个带有版本信息的标题等),然后使用一个案例将其发送到正确的解析器(目前使用LINQ to XML)。但是,这似乎并不优雅。特别是如果我们需要支持10个版本。
没有任何东西突然出现在我身上......只是想看看其他人会如何接近这一点。
答案 0 :(得分:1)
如果你有X版本的架构,你需要X代码路径来处理它们。
要选择你的实现,你必须在某处有一个switch语句。该开关可以简单地调用方法,也可以在工厂方法中返回正确的解析器(类或委托)。
这并不妨碍您在版本之间共享部分代码,最好将解析分解为其组件部分以支持此功能。你可以通过课程或方法将它们分解。
您可以使用一个公共基本接口来启动解析任何版本,并获取XML所代表的对象图。理想情况下,生成的对象模型应尽可能与版本无关,以便您可以共享通用功能。
或者,您可以使用XSLT升级数据,并且只使用一个解析器。
您可以为每个版本实现一次并链接所有转换,也可以直接转换为最新版本,并在每个版本中修改以前版本的转换。
链接转换具有更好的维护成本。直接变换有更好的性能。
你还需要一个开关:)
答案 1 :(得分:1)
如果你的版本是一个数字,你可以有类似的东西 public interface IOrderMessageHandler { void Handle(OrderMessage消息); }
public class OrderMessageHandlerVersion123 : IOrderMessageHandler { ... }
具有命名约定并使用反射构造它们:
var handler = (IOrderMessageHandler)Activator.CreateInstance( GetType().Assembly.GetType("MyNamespace.OrderMessageHandlerVersion" + message.Version));
handler.Handle(message)
答案 2 :(得分:1)
另一种解决方案是使用一组xslt脚本,它们将旧版本的xml转换为最新版本(通过顺序应用脚本将版本N-1转换为版本N)。在这种情况下,您将只有一个“处理机制”,它只支持最新版本的XML。
处理机制如下: