Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 面向对象到xml转换的设计模式_Design Patterns_Xml Serialization - Fatal编程技术网

Design patterns 面向对象到xml转换的设计模式

Design patterns 面向对象到xml转换的设计模式,design-patterns,xml-serialization,Design Patterns,Xml Serialization,我们有一组不同的POCO实体,它们表示应用程序的域模型。现在,我们需要提出一种xml表示法来编译来自不同实体的数据,这些数据将被其他应用程序使用。我们有一个关于最终表示的xml参考 基于以上内容,我有两个问题,主要是关于最佳实践和优化: 给定一个目标xml结构,基于来自不同实体的数据创建xml文件的最佳推荐方法是什么?我应该尝试使用xsl转换还是基于xsd生成目标类并使用自定义翻译等 因为这是POC练习的一部分,所以XML转换最终将被数据库中的数据持久性或/和JSON对象的转换所取代。我想知道

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

基于以上内容,我有两个问题,主要是关于最佳实践和优化:

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

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

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

genric 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);
        }
    }
公共静态字符串GetString(T值)
{
使用(var ms=new MemoryStream())
{
var ser=新数据契约JSONSerializer(类型(T));
ser.WriteObject(毫秒,值);
byte[]json=ms.ToArray();
Close女士();
返回Encoding.UTF8.GetString(json,0,json.Length);
}
}
我在过去尝试过XSLT路线,虽然它很强大,但它有一种快速变得复杂的趋势。使用上面的目标模型,您将能够在需要时调试转换,它还为您提供了一系列前进的机会

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

提示:如果目标需要来自多个对象的值,可以将其设置为映射到同一对象的序列,请参见此

如果没有具体的结构,很难给出一个好的通用答案

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

您在这里寻找的设计模式是一个。这些是没有行为的简单类。然后创建一个汇编器,将应用程序的域模型转换为DTO

假设您使用的是C#或VB.Net,则可以轻松创建DTO。我相信你能找到其他语言的对应词

一旦你设置好了,你放在汇编程序中进行转换的内容就不那么重要了,因为它被很好地封装了。如果您需要,它可以在将来很容易地更改。然而,正如Tommy所说,我建议不要使用XSLT。XSLT实际上只允许您更改XML文档的形状,它不允许值的替换(ID的枚举名称)或计算(订单行的总和表示总数)

有关更多信息,请参阅:




目标对象将需要来自多个域实体的数据。我们怎样才能用AutoMapper做到这一点?您能否再解释一下如何使用facade隐藏翻译实现。如果您能提供一些示例代码,就更容易理解了。