我从源中获取数据后填充了大量数据对象。 Feed不可靠,有时会丢失数据。我需要将传入的数据与我已有的数据合并。我无法找到一个容易扩展和可扩展的模式。
例如,我的datamodel具有以下字段
DataModelExample
{
public string Name;
public string Value;
public string Extension;
}
如果Feed删除字段Value,我可以从缓存中从现有数据对象中选择数据并合并这两者。我有许多数据对象,其中包含不同数量的字段,需要这样做。
有什么想法吗?
答案 0 :(得分:2)
一种可能的方式:
您可以更改所有属性定义,使其全部为nullable
。
例如,如果您有public int MyInt { get; set; }
属性,请将其更改为public int? MyInt { get; set; }
然后,在您的Feed中填充对象后,您可以使用反射(请参阅How to loop through all the properties of a class?)迭代所有属性,如果值为null(这意味着Feed ),则可以为每个属性进行迭代删除属性),使用来自缓存的值设置它。
答案 1 :(得分: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;
}
}
您需要为每个数据对象接口编写一个合并类,因此该解决方案需要比基于反射的解决方案更多的代码。我认为你不能绕过这项工作。这是一个权衡:运行时性能与总体编码时间。老实说,除非你的用户开始抱怨,否则我会把运行时性能提升,但这取决于你。