簡體   English   中英

C#設計模式以合並數據對象

[英]C# Design pattern to merge data objects

我從源中獲取數據后填充了大量數據對象。 Feed不可靠,有時會丟失數據。 我需要將傳入的數據與我已有的數據合並。 我無法找到一個易於擴展和可擴展的模式。

例如,我的datamodel具有以下字段

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

如果Feed刪除字段Value,我可以從緩存中從現有數據對象中選擇數據並合並這兩者。 我有許多數據對象具有不同數量的字段,需要這樣做。

有任何想法嗎?

一種可能的方式:

您可以更改所有屬性定義,以便它們都可nullable

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

然后,在從Feed中填充對象后,您可以使用反射迭代所有屬性(請參閱如何循環遍歷類的所有屬性? )和每個屬性,如果值為null(這意味着Feed) 刪除屬性),使用來自緩存的值設置它。

代替@ 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;
    }
}

您需要為每個數據對象接口編寫一個合並類,因此該解決方案需要比基於反射的解決方案更多的代碼。 我認為你不能繞過這項工作。 這是一個權衡:運行時性能與總體編碼時間。 老實說,除非你的用戶開始抱怨,否則我會把運行時性能提升,但這取決於你。

請記住, 過早優化是萬惡之源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM