2010-08-31 75 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

相關問題