2010-06-10 113 views
2

如何在.NET中設計應用程序(類,類庫中的接口),當我們有固定的數據庫設計時,我們需要支持從第三方數據源,這很可能是XML?從第三方數據源導入數據(開放式架構設計)

例如,讓我們說,我們已經在我們的數據庫產品表具有列 編號 標題 說明 TaxLevel 價格

和我們有例如產品的另一面: 產品編號 ProdTitle 正文 BasicPrice 數量。

目前我這樣做: 讓第三方XML轉換爲類和XSD,然後將其內容反序列化爲強類型對象(由於此過程得到的是像ThirdPartyProduct,ThirdPartyClassification等類。 )。

然後,我有這樣的方法:

InsertProduct(ThirdPartyProduct newproduct) 

我不此刻的使用接口,但是我想。我想要的是實現類似

public class Contoso_ProductSynchronization : ProductSynchronization 
{ 
    public void InsertProduct(ContosoProduct p) 
    { 
     Product product = new Product(); // this is our Entity class 
     // do the assignments from p to product here 

     using(SyncEntities db = new SyncEntities()) 
     { 
      // .... 
      db.AddToProducts(product); 
     } 
    } 

    // the problem is Product and ContosoProduct have no arhitectural connection right now 
    // so I cannot do this 
    public void InsertProduct(ContosoProduct p) 
    { 
     Product product = (Product)p; 

     using(SyncEntities db = new SyncEntities()) 
     { 
      // .... 
      db.AddToProducts(product); 
     } 
    } 
} 

其中ProductSynchronization將是一個接口或抽象類。很可能會有很多ProductSynchronization的實現。我無法對類型進行硬編碼 - 像ContosoProduct這樣的類,NorthwindProduct可能是由第三方XML創建的(所以我最好繼續使用反序列化)。

希望有人會明白我在這裏要解釋的。試想一下,你是賣家,你有很多供應商,每個供應商都使用他們自己的專有XML格式。我不介意這種開發,當然每次出現新格式時都會需要這種開發,因爲它只需要實現10-20種方法,我只希望開放架構並支持它。在你的回覆中,請關注設計,而不是太多關注數據訪問技術,因爲大多數都非常簡單易用(如果你需要知道,EF將用於與我們的數據庫進行交互)。

回答

0

[編輯:設計注意事項】

好了,從設計的角度來看,我會做對傳入的XML XSLT把它轉換成統一格式。也很容易驗證XML模式的結果。

使用xslt我會遠離任何接口或抽象類,只在我的代碼中有一個類實現,即內部類。它會保持代碼基礎清潔,如果數據如你所描述的那樣簡單,那麼xslt本身應該很短。

記錄轉換可以輕鬆完成,無論您擁有項目文檔。

如果您決定絕對要每xml有一個類(或者如果您可能從一個客戶獲得.net dll而不是xml),那麼我會讓代理類繼承一個接口或抽象類(基於關閉您的內部類,並根據需要在代理類中實現每個屬性的映射。通過這種方式,你可以將任何職業施放到你的基地/內部職業。

但在我看來,在代碼中進行轉換/映射會使代碼設計更加混亂。

[原創答案]

如果我理解正確的話,你希望通過映射ThirdPartyProduct類到自己的內部類。

最初我在思考類映射。使用類似Automapper的東西,並在創建xml反序列化代理時配置映射。如果你使你的反序列化最終具有與你的內部類相同的屬性名,那麼映射器的配置就不那麼簡單了。約定優於配置。

我想聽聽有關走這條路線的任何人的想法。

另一種方法是在Converter類中添加一個.ToInternalProduct(ThirdPartyClass)。並且在添加更多外部類時繼續添加更多內容。

第三種方法是針對XSLT的人。如果你喜歡XSLT,你可以將xml轉換成可以反序列化到你的內部產品類中的東西。

這三個我選擇的哪一個取決於程序員的技能,以及誰會維護添加新的外部類。隨着新格式的到來,XSLT方法不需要重新編譯或編譯代碼。這可能是一個優勢。

+0

對不起,但我沒有詢問映射場景,問題更多的是關於設計。我的類和接口應該如何設計? 我知道這個問題還不夠清楚,但我無法更好地解釋它。 – mare 2010-06-10 19:10:04

+0

編輯我的答案。有時,如何映射數據是實際設計的重要組成部分。 – 2010-06-10 19:52:13

+0

我已經接受您的解決方案,因爲可能是最好的,但由於缺乏XSLT知識,我不會那樣做。 – mare 2010-06-11 11:19:22