C#设计模式以合并数据对象

时间:2012-08-02 15:02:07

标签: c# design-patterns

我从源中获取数据后填充了大量数据对象。 Feed不可靠,有时会丢失数据。我需要将传入的数据与我已有的数据合并。我无法找到一个容易扩展和可扩展的模式。

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

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

如果Feed删除字段Value,我可以从缓存中从现有数据对象中选择数据并合并这两者。我有许多数据对象,其中包含不同数量的字段,需要这样做。

有什么想法吗?

2 个答案:

答案 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;
    }
}

您需要为每个数据对象接口编写一个合并类,因此该解决方案需要比基于反射的解决方案更多的代码。我认为你不能绕过这项工作。这是一个权衡:运行时性能与总体编码时间。老实说,除非你的用户开始抱怨,否则我会把运行时性能提升,但这取决于你。

请记住, premature optimization is the root of all evil