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

时间:2010-08-31 16:14:25

标签: .net design-patterns language-agnostic oop

我正在开发一个项目,我必须从一个来源获取数据并进行翻译/调整,以便它可以被不同的源(在本例中为数据库)正确使用。我想这是一个相当普遍的问题,虽然我相信我有一个良好的开端,但我仍然坚持如何最好地实现解决方案的中间部分,该解决方案负责解析原始数据并制作数据可用于我的流程的下一部分。

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

我已经有了将数据插入数据库的存储过程,我甚至创建了帮助方法来与存储过程进行通信。我还有IOrderHeaderIOrderPayment等接口,作为这些辅助方法使用的数据的“契约”存在。

我试图弄清楚是否存在一个好的模式来解析原始MyVendor.CustomOrder对象中的数据,以便为IOrderHeader 接口提供数据。以下是我可以想象这些部分是如何组合在一起的(在一个略微有用的ASCII图中):

________________________________
|                              |
| Web Service to receive order | 
|                              |   
|  __________________________  |
|__|                        |__|
   |  MyVendor.CustomOrder  |
   |________________________|

               ||
               ||
               \/
   __________________________
   |                        |
   | ?????????????????????? |
   |          Parse         |
   |  MyVendor.CustomOrder  |
   |   and pass data to     |
   |        next step       |
   | ?????????????????????? |
   |________________________|

               ||
               ||
               \/
        _________________________   
        |                       |
________|________               |
| IOrderHeader  |               | 
|_______________|   Methods     |
________|________     to        |
| IOrderPayment |   Add Data    |
|_______________|     to        |
________|________   Database    |
| IOrderDiscount|               |
|_______________|               |
________|________               |
|  IOrderItem   |               |
|_______________|               |
        |_______________________|

               ||
               ||
               \/
   __________________________
   |                        |
   | Data Access Layer,     |
   | Database, etc....      |
   |________________________|      

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

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();

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

3 个答案:

答案 0 :(得分:2)

这似乎是adapter pattern的好例子。

  

转换某些类b的接口   进入某个客户端的接口   c级理解。

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

答案 1 :(得分:0)

因此,当您的第三方供应商看到订单时,您有一个代表订单的类,而当您的域模型看到订单时,您有一个代表订单的类,对吗?我不知道这是否有帮助,但在过去我通过将扩展方法附加到我的类(DomainClass dc = ThirdPartyClass.toDomainClass())或者在一个类中可以采用构造函数来完成这样的操作它的姐妹类的一个实例并解析它(DomainClass dc = new DomainClass(ThirdPartyClass))。我的持久化逻辑所在的地方没有翻译逻辑。我最终会得到像vendorRepository.SaveNewVendor(new DomainClass(ThirdPartyClass))或vendorRepository.SaveNewVendor((ThirdPartyClass.toDomainClass())

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

答案 2 :(得分:0)

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

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