将一种数据转换为另一种数据的设计模式

时间:2014-05-21 13:10:30

标签: design-patterns

我必须从一个发送JSON中描述的数据的干净(呃)REST Web服务中调用一个传统的SOAP Web服务来发送原始DataSet

我需要将列出我的对象的原始数据集转换为真正的对象列表。

我得到的数据集没有足够的信息,因此转换不是简单的"。它涉及从每个对象的DB中获取附加数据。

这样做的最佳设计模式是什么?我的第一个天真的反射是创建一个方法,将这个数据集作为参数,解析它,并返回一个对象列表,但我觉得必须有一个更好的方法来做到这一点。

我已经看过适配器模式,但我理解它只是"只有"将现有的类转换为另一个类似于"看起来像#34;。我希望将数据从类似于带有id和name的字符串表的内容完全更改为包含每个有用信息的真实实例集合。

更新

我还有另一个类似的问题。我们有一个旧的桌面应用程序和一个新的在线应用程序,它们以不同的方式执行相同的操作。但是,这两个应用程序的保存文件非常不同 我想在这些格式之间创建一个转换器。正如@ VS1所建议的Mapper模式看起来很有希望进行此操作,但我不认为我能够使用像AutoMapper一样简单直接的东西。适配器模式也可能有所帮助。我会调查这些。

2 个答案:

答案 0 :(得分:7)

您需要自己构建一种Mapper,将Dataset转换为objects;或者您可以使用AutoMapper等可用工具。

这些映射通常需要AdapterBuilder设计模式的知识。我会强调更多的 Builder 模式在构建此映射时更为重要。

您还可以使用LINQExtension Methods按照this example来达到您的要求。

答案 1 :(得分:3)

这类工作会浮现一些“模式”:

  1. Serialization/Deserialization:我把模式放在引号中,因为我认为这不是一个模式,但它为你想要完成的事情提供了一个正确的名称。希望这样可以更轻松地搜索帮助/资源。有许多现有的库可用于在JSON,SOAP(XML)和对象之间进行序列化(您使用的是哪种语言?)。这些通常利用类上的属性来帮助进行正确的转换,只留下少量代码来进行实际的转换。
  2. Facade Pattern:如果您已经关闭了序列化部分,并且实际上可以从旧服务中返回对象,则可以使用Facade Pattern将旧对象换成新对象,以便更好地映射到新对象服务。例如,如果新服务对象需要实现不同的接口:
  3. SoapServiceObject sso = OldService.Get();
    IRestServiceObject rso = new RestServiceObjectFacade(sso);
    
    public class SoapServiceObject
    {
        public string name;
    }
    
    public class RestServiceObjectFacade : IRestServiceObject
    {
        private SoapServiceObject _sso;
    
        public string IRestServiceObject.Title { get { return this._sso.name; } }
    
        public RestServiceObjectFacade(SoapServiceObject sso)
        {
            this._sso = sso;
        }
    }