C#合并数据对象的设计模式
在从提要获取数据后,我填充了一堆数据对象。提要不可靠,有时会丢失数据。我需要将传入数据与我已有的数据合并。我无法找到一个易于扩展和扩展的模式 例如,我的数据模型有以下字段C#合并数据对象的设计模式,c#,design-patterns,C#,Design Patterns,在从提要获取数据后,我填充了一堆数据对象。提要不可靠,有时会丢失数据。我需要将传入数据与我已有的数据合并。我无法找到一个易于扩展和扩展的模式 例如,我的数据模型有以下字段 DataModelExample { public string Name; public string Value; public string Extension; } 如果提要删除了字段值,那么我可以从缓存中的现有数据对象中拾取数据,并将两者合并。我有许多数据对象,其中的字段数量不一,需要执行这
DataModelExample
{
public string Name;
public string Value;
public string Extension;
}
如果提要删除了字段值,那么我可以从缓存中的现有数据对象中拾取数据,并将两者合并。我有许多数据对象,其中的字段数量不一,需要执行这些操作
有什么想法吗?一种可能的方法:
您可以更改所有属性定义,使它们都可以为空
例如,如果您有一个public int MyInt{get;set;}
属性,请将其更改为public int?MyInt{get;set;}
然后,从提要填充对象后,可以使用反射(请参阅)迭代所有属性,对于每个属性,如果值为null(这意味着提要删除属性),则使用缓存中的值设置它。一种可能的方法:
您可以更改所有属性定义,使它们都可以为空
例如,如果您有一个public int MyInt{get;set;}
属性,请将其更改为public int?MyInt{get;set;}
然后,在从提要填充对象之后,可以使用反射(请参阅)迭代所有属性,对于每个属性,如果值为null(这意味着提要删除属性),则使用缓存中的值设置它。代替@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;
}
}
您需要为每个数据对象接口编写一个合并类,因此此解决方案需要比基于反射的解决方案多得多的代码。我认为你不能逃避这项工作。这是一个权衡:运行时性能与总体编码时间。老实说,除非你的用户开始抱怨,否则我会受到运行时性能的影响,但这取决于你
记住,.代替@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;
}
}
您需要为每个数据对象接口编写一个合并类,因此此解决方案需要比基于反射的解决方案多得多的代码。我认为你不能逃避这项工作。这是一个权衡:运行时性能与总体编码时间。老实说,除非你的用户开始抱怨,否则我会受到运行时性能的影响,但这取决于你
请记住,.如何拾取缓存的对象?您是否可以使用Name
将两个对象匹配在一起?我有一个带有键值映射的缓存。因此,DataModelExample类型的对象将始终具有键-DataModelExampleKey,这是我用来从缓存中获取数据的?您是否可以使用Name
将两个对象匹配在一起?我有一个带有键值映射的缓存。因此,DataModelExample类型的对象将始终具有key-DataModelExampleKey,这是我将用于从缓存中获取数据的键。感谢您的回复。我不喜欢使用反射,因为它的性能成本太高。@user1542794好的,但是如果您的要求之一是“我有很多数据对象,其中有不同数量的字段需要执行此操作”,如果不复制,我看不到太多的可能性code@user1542794您仍然可以使用nullable技术来明确删除了哪些值,然后自己编写合并代码,而不是使用反射。只会更少maintainable@pickles是的,这都是关于可维护性的。我会在这里使用反射,我怀疑OP是在的情况下。这种方法工作得很好。然而,我一直无法获得批准的设计。第二次我用“反思”这个词时,人们难以置信地喘息着。还在努力。谢谢ken2k。谢谢你的回复。我不喜欢使用反射,因为它的性能成本太高。@user1542794好的,但是如果您的要求之一是“我有很多数据对象,其中有不同数量的字段需要执行此操作”,如果不复制,我看不到太多的可能性code@user1542794您仍然可以使用nullable技术来明确删除了哪些值,然后自己编写合并代码,而不是使用反射。只会更少maintainable@pickles是的,这都是关于可维护性的。我会在这里使用反射,我怀疑OP是在的情况下。这种方法工作得很好。然而,我一直无法获得批准的设计。第二次我用“反思”这个词时,人们难以置信地喘息着。还在努力。谢谢ken2k。