[英]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.