4

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

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

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

2 回答 2

1

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

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

从目标模型可以很容易地生成 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 路线,虽然它很强大,但它往往会很快变得复杂。使用上面的目标模型,您将能够在需要时调试您的转换,它还为您提供了一系列前进的机会。

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

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

如果没有考虑到特定的结构,很难给出一个好的通用答案。

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

于 2012-07-13T07:51:58.220 回答
0

您在此处寻找的设计模式是数据传输对象 (DTO)。这些是没有行为的简单类。然后,您将创建一个汇编程序以将应用程序的域模型转换为 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

于 2012-07-13T08:49:30.557 回答