【问题标题】:Design pattern for object to xml conversion对象到 xml 转换的设计模式
【发布时间】:2012-07-12 14:38:37
【问题描述】:

我们有一组不同的 POCO 实体,它们代表应用程序的域模型。现在我们需要提出一个 xml 表示来编译来自不同实体的数据,这些数据将被其他应用程序使用。我们有一个关于最终表示应该是什么样子的参考 xml。

基于上述,我有两个问题主要与最佳实践和优化有关:

  • 给定目标 xml 结构,根据来自不同实体的数据创建 xml 文件的最佳和推荐方法是什么?我应该尝试使用 xsl 转换还是基于 xsd 生成目标类并使用自定义翻译等。
  • 由于这是 POC 练习的一部分,XML 转换最终将被数据库中的数据持久性或/和到 JSON 对象的转换所取代。我想知道是否可以使用某种设计模式来抽象出目标实现,这样当 xml 生成例程被 DAL 调用或 JSON 翻译代码替换时,主代码就不会受到影响。有什么想法吗?

【问题讨论】:

    标签: design-patterns xml-serialization


    【解决方案1】:

    使用MS xsd tool 创建基于目标xsd 的目标模型(POCO-ish),并通过隐藏翻译实现的外观在代码中进行转换。

    为了简化转换,您可以使用例如Automapper on github

    从目标模型可以很容易地生成 XML、JSON 或使用实体框架等持久化数据。

    通用 JSON 序列化示例:

        public static string GetString<T>(T value)
        {
            using (var ms = new MemoryStream())
            {
                var ser = new DataContractJsonSerializer(typeof(T));
                ser.WriteObject(ms, value);
                byte[] json = ms.ToArray();
                ms.Close();
                return Encoding.UTF8.GetString(json, 0, json.Length);
            }
        }
    

    我过去曾尝试过 XSLT 路线,虽然它很强大,但它往往会很快变得复杂。使用上面的目标模型,您将能够在需要时调试您的转化,它还为您提供了一系列前进的机会。

    Re: AutoMapper,在这种情况下,当目标结构复杂并且可能与源结构不同时,很难让 AutoMapper 直接映射所有内容,我通常会创建一个 Orchestrator/SuperMapper 来负责对于内部使用 AutoMapper 的整体结构/映射。

    提示:如果一个目标需要多个值,则可以将其设置为同一个对象的一系列映射,请参阅question/answer

    如果不考虑具体结构,很难给出一个好的通用答案。

    Re: Facade 维基百科对这种模式有很好的定义 >> Facade on Wikipedia 但简而言之,为您的 Orchestrator/SupperMapper 定义最简单的接口,这样您就可以将翻译结构的内部工作与应用程序的其余部分分开。这样,当您的需求发生变化时,您可以轻松地将其换成其他东西。这样,您的应用程序的其余部分不需要了解 AutoMapper 或目标模型。它所知道的只是放入源模型并期望返回 Json。

    【讨论】:

    • 目标对象将需要来自多个域实体的数据。我们如何使用 AutoMapper 做到这一点?你能解释一下关于使用外观隐藏翻译实现的更多信息吗?如果你能提供一些示例代码,那就更容易理解了。
    【解决方案2】:

    您在这里寻找的设计模式是Data Transfer Object (DTO)。这些是没有行为的简单类。然后,您将创建一个 Assembler 以将应用程序的域模型转换为 DTO。

    假设您使用的是 C# 或 VB.Net,则可以使用 xsd.exe 轻松创建 DTO。我相信您可以找到其他语言的等价物。

    一旦你完成了这个设置,你在 Assembler 中进行转换的内容就不那么重要了,因为它被很好地封装了。如果您需要,将来可以轻松更改它。然而,正如 Tommy 所说,我建议不要使用 XSLT。 XSLT 仅真正允许您更改 XML 文档的形状,它不允许进行诸如值替换(id 的枚举名称)或计算(订单行的总和得出总数)之类的事情。

    欲了解更多信息,请参阅:

    http://martinfowler.com/eaaCatalog/dataTransferObject.html
    http://msdn.microsoft.com/en-us/library/ms978717.aspx
    http://en.wikipedia.org/wiki/Data_transfer_object

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多