.net 将数据从一种类型转换为另一种类型有哪些模式?

.net 将数据从一种类型转换为另一种类型有哪些模式?,.net,design-patterns,language-agnostic,oop,.net,Design Patterns,Language Agnostic,Oop,我正在做一个项目,在这个项目中,我必须从一个来源获取数据,并对其进行翻译/调整,以便它可以被另一个来源(在本例中是数据库)正确使用。我认为这是一个相当常见的问题,虽然我相信我已经有了一个良好的开端,但我一直在思考如何最好地实现解决方案的中间部分,该部分负责解析原始数据,并使该数据可用于流程的下一部分 假设我公司的服务器上有一个web服务,负责接收第三方供应商提供的销售订单。供应商调用web服务后,我应该有一个名为MyVendor.CustomOrder的强类型对象。然后,我负责解析MyVendo

我正在做一个项目,在这个项目中,我必须从一个来源获取数据,并对其进行翻译/调整,以便它可以被另一个来源(在本例中是数据库)正确使用。我认为这是一个相当常见的问题,虽然我相信我已经有了一个良好的开端,但我一直在思考如何最好地实现解决方案的中间部分,该部分负责解析原始数据,并使该数据可用于流程的下一部分

假设我公司的服务器上有一个web服务,负责接收第三方供应商提供的销售订单。供应商调用web服务后,我应该有一个名为
MyVendor.CustomOrder
的强类型对象。然后,我负责解析
MyVendor.CustomOrder
实例,以便在我公司的系统中将数据正确格式化为“订单”

我已经有了将数据插入数据库的存储过程,甚至还创建了与存储过程通信的助手方法。我还有一些接口,如
IOrderHeader
IOrderPayment
等,作为这些helper方法使用的数据的“契约”存在

我正在试图找出是否存在一个好的模式来解析原始
MyVendor.CustomOrder
对象中的数据,以便为
IOrderHeader
等接口提供数据。下面是我如何想象这些片段是如何组合在一起的(在一个稍微有用的ASCII图中):

到目前为止,我唯一的想法是创建一个处理所有事情的大型类,可能是这样的:

public class MyVendorCustomOrderParserAndDatabaseUpdater
{
     private IOrderItem _IOrderItem;
     //other private interface instantiations

     public MyVendorCustomOrderParserAndDatabaseUpdater(
                MyVendor.CustomerOrder customOrder)
     {
          ParseOrderIntoInterfaces(customOrder);
     }

     private void ParseOrderIntoInterfaces(
                 MyVendor.CustomOrder customOrder)
     {
          //Parse customOrder into _IOrderItem, etc.
     }

     public bool SendOrderToTheSystem()
     {
         //Call the helper methods with the data
         //from the private _IOrderHeader, etc. objects
         //to update "the system"
     }
}
然后,我将使用以下代码使用此对象:

... = new MyVendorCustomOrderParserAndDatabaseUpdater(
        customOrder).SendOrderToTheySystem();

我很想知道是否有更好的模式来解决从一种格式获取数据的问题,以便在不同的环境中正确使用数据。

因此,您有一个类表示第三方供应商看到的订单,一个类表示域模型看到的订单,对吗?我不知道这是否有帮助,但在过去,我做过类似的事情,要么给我的类附加一个扩展方法(DomainClass dc=ThirdPartyClass.toDomainClass()),要么在一个类中有一个构造函数,可以获取它的姐妹类的一个实例并解析它(DomainClass dc=new DomainClass(ThirdPartyClass))。我的翻译逻辑与我的持久性逻辑所处的位置不同。我最终会得到像vendorRepository.SaveNewVendor(新域类(ThirdPartyClass))或vendorRepository.SaveNewVendor((ThirdPartyClass.toDomainClass())这样的东西


我不知道这对你是否有价值。

这似乎是一个很好的案例

转换某个类b的接口 进入某个客户端的接口 c班学生理解


如果您收到来自不同第三方供应商的订单,您将为每个供应商创建一个适配器,然后您甚至可以使用工厂模式为给定供应商创建正确的适配器。

从某种意义上说,您所做的有点类似于序列化。例如,XmlSerialization将对象转换为XML,然后返回into对象。要将MyVendor.CustomerOrder转换为系统中的一组对象(OrderHeader等),然后再转换回原始对象


如果遵循这种模式,您将拥有一个映射器对象,它知道如何从一种“格式”转换为另一种“格式”。XmlSerialization的映射器对象是XmlSerializer对象(为特定类型的对象配置)。您可以实现一个等效的mapper对象,它知道如何在两种格式之间来回封送数据。

这是一个有趣的观察结果。我不确定它是否与我的模型完全匹配,因为我的数据只需要在一个方向上转换,不需要进行字符串序列化,但我可以看到哪里可能有simila它在“抽象”层面上绝对相似,但在“橡胶撞击”道路时有点不同。无论如何,我没有意识到你只是在一个方向上进行转换。考虑到这一点,我认为“mapper”类仍然是处理转换的好方法。但你是对的,这使得类比不那么直接。干杯
... = new MyVendorCustomOrderParserAndDatabaseUpdater(
        customOrder).SendOrderToTheySystem();