繁体   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