Design patterns 将一种类型的数据转换为另一种类型的设计模式

Design patterns 将一种类型的数据转换为另一种类型的设计模式,design-patterns,Design Patterns,我必须调用一个传统的SOAP Web服务,它从一个干净(er)的REST Web服务发送JSON中描述的数据,然后发送原始数据 我需要将列出我的对象的原始数据集转换为真正的对象列表 我得到的数据集没有足够的信息,因此转换并不“简单”。它涉及从数据库中为每个对象获取额外的数据 最好的设计模式是什么?我的第一个天真反射是创建一个方法,将这个数据集作为参数,解析它,并返回一个对象列表,但我觉得一定有更好的方法来实现这一点 我见过适配器模式,但我理解它“仅”将现有类转换为另一个“看起来像”的类。我想完全

我必须调用一个传统的SOAP Web服务,它从一个干净(er)的REST Web服务发送JSON中描述的数据,然后发送原始数据

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

我得到的数据集没有足够的信息,因此转换并不“简单”。它涉及从数据库中为每个对象获取额外的数据

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

我见过适配器模式,但我理解它“仅”将现有类转换为另一个“看起来像”的类。我想完全改变数据,从一个类似于id和名称的字符串表的数据,变成一个包含所有有用信息的实例的真实集合

更新 我还有一个类似的问题。我们有一个旧的桌面应用程序和一个新的在线应用程序,它们做同样的事情,但方式不同。不过,这两个应用程序的保存文件非常不同。
我想在这些格式之间创建一个转换器。@VS1所建议的映射器模式对于这个操作来说很有希望,但我认为我不能像AutoMapper那样简单直接地使用它。适配器模式也可能有帮助。我将研究这些。

对于这类工作,我会想到一些“模式”:

  • :我把模式放在引号里,因为我不认为这算是一种模式,但它给你想要完成的事情起了一个恰当的名字。希望这样可以更容易地搜索帮助/资源。有很多现有库用于在JSON、SOAP(XML)和对象(您使用的是什么语言?)之间进行序列化。它们通常利用类上的属性来帮助进行适当的转换,只留下少量代码来进行实际的转换
  • :如果您已经关闭了序列化部分,并且实际上可以从遗留服务返回对象,则可以使用Facade模式将旧对象包装为新对象,以便更好地映射到新服务。例如,如果您的新服务对象需要实现不同的接口:

  • 您需要自己构建一种
    映射器
    ,将
    数据集
    转换为
    对象
    ;或者您可以使用可用的工具,例如

    这些映射通常需要对设计模式的了解。我要强调的是,在构建此映射时,更为重要的是Towards Builder模式


    您还可以使用
    LINQ
    扩展方法来实现您的需求。

    我刚才回答了一个非常类似的问题。这有用吗?为什么你认为你需要比单个函数更复杂的东西?您是否需要或预见到需要多个转换器?它们之间有依赖关系吗?是否应在运行时选择转换器?运行时更新?@Daveshweisguth:这是一个非常有趣的想法,但我认为它不能解决我的问题。不过我会记住的。@AndyT:我真的不确定。这更像是一种“它可以更优雅,但如何做到?”的感觉。@AndyT:事实上,我刚刚想到了另一个使用案例。我会更新文章的更多细节。谢谢,这看起来解决了我的问题。我将研究这些信息。
    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;
        }
    }