2010-08-31 76 views
2

我正在开发一个项目,我必须从一个源获取数据并对其进行翻译/调整,以便它可以被其他源(在本例中为数据库)正确使用。我想这是一个相当普遍的问题,尽管我相信自己的开局不错,但我仍然坚持如何最好地实施解决方案的中间部分,负责解析原始数据并生成该数据可用于我的流程的下一部分。将数据从一种类型转换为另一种类型存在哪些模式?

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

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

我试图找出如果一个很好的模式存在,即在原始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(); 

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

回答

2

这似乎为adapter pattern一个很好的例子。

转换的一些b类 接口转换成一个接口,一些客户 C类理解。

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

0

因此,您有一个代表订单的类,因为您的第三方供应商可以看到它,并且表示您的域模型认为它的订单类正确吗?我不知道这是否有帮助,但在过去,我通过将附加扩展方法附加到我的类(DomainClass dc = ThirdPartyClass.toDomainClass())或通过在一个类中使用构造函数它的姐妹类的一个实例并解析它(DomainClass dc = new DomainClass(ThirdPartyClass))。我的持久性逻辑所在的地方没有翻译逻辑。我最终会像vendorRepository.SaveNewVendor(新DomainClass(ThirdPartyClass))或vendorRepository.SaveNewVendor((ThirdPartyClass.toDomainClass())

我不知道如果这是任何价值给你与否。

0

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

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

+0

这是一个有趣的观察。我不是完全符合我的模型,因为我的数据只需要在一个方向上进行转换,而且我不需要进行字符串序列化,但是我可以看到哪里可能有相似之处。 – 2010-09-01 01:41:34

+0

它在“抽象”层面绝对相似,但有点不同“当橡胶撞击”道路时。 :)在任何情况下,我都没有意识到你只是在一个方向上进行转换。考虑到这一点,我认为一个“映射器”类仍然是处理转换的好方法。但是你是对的,这使得这个比喻不那么直接。干杯! – mikemanne 2010-09-01 14:25:24

相关问题