2012-08-02 41 views
0

我有一堆數據對象,我從Feed中獲取數據後填充。 Feed不可靠,有時會丟棄數據。我需要將傳入的數據與我已有的數據合併。我無法找出一個容易擴展和可擴展的模式。C#設計模式合併數據對象

例如, 我的數據模型具有以下領域

DataModelExample 
{ 
    pubic string Name; 
    pubic string Value; 
    pubic string Extension; 
} 

如果原料下降的字段中的值,它是好的,對我來說,從緩存中現有的數據對象挑選數據和合並兩個。我有許多數據對象,其中需要完成這些數據對象的數量不盡相同。

任何想法?

+0

你將如何挑選一個緩存的對象?你會用'Name'來將兩個物體匹配在一起嗎? – FishBasketGordo 2012-08-02 15:07:49

+0

我有緩存鍵值映射。因此,DataModelExample類型的對象將始終具有密鑰--DataModelExampleKey,這將用於從緩存中獲取數據。 – user1542794 2012-08-02 15:14:31

回答

2

一種可能的方式:

你可以改變你的全部財產的定義,使他們都nullable

舉例來說,如果你有一個public int MyInt { get; set; }屬性,將其更改爲public int? MyInt { get; set; }

然後,在你的對象已經從您的飼料填充,你可以在所有的屬性使用反射(見How to loop through all the properties of a class?)進行迭代,併爲每屬性,如果值爲空(意味着Feed 下降該屬性),請使用來自緩存的值進行設置。

+0

感謝您的回覆。由於其性能成本,我並不熱衷於使用反射。 – user1542794 2012-08-02 15:16:54

+1

@ user1542794好的,但是如果你的一個要求是「我有許多數據對象,這些數據對象需要完成這些操作」,我不會看到很多可能性,而不必複製代碼 – ken2k 2012-08-02 15:23:46

+0

@ user1542794你可以仍然使用可空技術來清除哪些值被刪除,然後自己編寫合併代碼,而不是使用反射。它只是不太可維護 – cordialgerm 2012-08-02 15:28:56

0

代替@ ken2k建議的反射,您可以創建一組類來處理對象,並在必要時合併緩存中的數據。爲了最大限度地減少您需要的類的數量,我會讓它們在您的數據對象實現的接口上進行操作。

public interface IDataModelExample 
{ 
    string Name { get; set; } 
    string Value { get; set; } 
    string Extension { get; set; } 
} 

public class DataModelExampleMerger 
{ 
    public IDataModelExample Merge(IDataModelExample dme) 
    { 
     var cachedDme = LoadFromCache(); // This would require the key of course. 
             // I'll leave the implementation up to 
             // you. 

     if (string.IsNullOrEmpty(dme.Name)) 
     { 
      dme.Name = cachedDme.Name; 
     } 

     // Repeat similar if-block for all properties. 

     return dme; 
    } 
} 

您需要編寫每個數據對象接口一個合併類,所以這種解決方案將需要比基於反射的解決方案相當多的代碼。我認爲你無法繞開這項工作。這是一個權衡:運行時性能與整體編碼時間。老實說,除非用戶開始抱怨,否則我會讓運行時間性能受​​到影響,但這取決於您。

請記住,premature optimization is the root of all evil