我有一个任务,向我提供一个基础对象,该基础对象包含来自我们的数据服务的对象和基元,并将其与客户端提供的同一对象上提供的数据耦合。它最终需要成为一个完整的对象。我将对象称为“ MyObject”。
这是数据服务中对象的外观:
MyObject.FirstName = null
MyObject.LastName = null
MyObject.DataProperty1 = anotherobject
anotherobject.property1 = somevalue1
anotherobject.property2 = somevalue2
anotherobject.property2 = somevalue2
MyObject.DataProperty2 = yetanotherobject
yetanotherobject.property1 = someothervalue1
yetanotherobject.property2 = someothervalue2
yetanotherobject.property3 = someothervalue3
yetanotherobject.property4 = someothervalue4
这是客户端提供对象时的外观
MyObject.FirstName = John
MyObject.LastName = Doe
MyObject.DataProperty1 = anotherobject
anotherobject.property1 = null
anotherobject.property2 = null
anotherobject.property2 = null
MyObject.DataProperty2 = yetanotherobject
yetanotherobject.property1 = null
yetanotherobject.property2 = null
yetanotherobject.property3 = null
yetanotherobject.property4 = null
我不能期望确切地知道哪个子项对象将为空,但是我确实知道,我需要最终合并的对象来包含两个原始对象的实际数据,而不是空值。显然,这些对象将比我在上面键入的对象复杂得多,但是要问的问题是有效的。
我曾尝试做类似merging two objects in C#的事情,但我无法弄清非原始事物。
我真的不认为这是AutoMapper的任务,因为MyObject的类型对于客户端和数据端都是相同的类。将其映射到自身没有任何意义。
太糟糕了,我不能走 MyObject1 + MyObject2 = NewCombinedObject哈哈。
此外,这是旧代码,我意识到它根本不是“最佳实践”。不过仍然需要解决问题。
答案 0 :(得分:0)
我可以看到您可能会遇到的两个问题,它们是潜在的阻碍因素:嵌套对象引用和引用其父母的孩子。两者都可能导致无限递归方案和内存不足错误。
您可以通过简单地确定您合并的深度不超过x级来减轻嵌套问题。这不是理想的选择,但可以防止这种情况下的无限递归。
孩子指父母的问题更为复杂。您必须能够将合并的对象映射到其原始对象,然后在输出中将引用节点映射回您已经合并的对象。这不是胆小者的任务。
这是AutoMapper不能为您完成的任务吗?如果是这样,我的直觉告诉我,它将为您做的比重新发明好得多,并且大大降低了出错的风险。