有没有办法让automapper不克隆同一个对象,而是在层次结构中遇到多个对象时使用单个对象?
基本上,我有一大堆不同的对象,它们都引用同一个对象。当我使用AutoMapper映射此集合时,它会生成一个对象数组,其中每个对象都引用一个新的克隆对象。所有这些克隆的对象不再等于引用。这最终导致我的内存不足。
有没有办法为AutoMapper配置某种缓存?
我在AutoMapper配置中尝试了.PreserveReferences()
,但这并没有达到我想要的效果。我认为这仅适用于循环引用。
更新
代码示例我使用。
测试.PreserveReferences()
[TestMethod]
public void TestMethod1()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<A, MA>().PreserveReferences();
cfg.CreateMap<B, MB>();
});
var b = new B();
var a1 = new A() { Ref = b };
var a2 = new A() { Ref = b };
Assert.AreNotSame(a1, a2);
Assert.AreSame(a1.Ref, a2.Ref);
var ma1 = Mapper.Map<MA>(a1);
var ma2 = Mapper.Map<MA>(a2);
Assert.AreNotSame(ma1, ma2);
Assert.AreSame(ma1.Ref, ma2.Ref); // This fails.
}
class A { public B Ref { get; set; } }
class B { }
class MA { public MB Ref { get; set; } }
class MB { }
答案 0 :(得分:4)
每次Map调用都会保留身份。
void Main()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<A, MA>().PreserveReferences();
cfg.CreateMap<B, MB>().PreserveReferences();
});
var b = new B();
var a1 = new A() { Ref = b };
var a2 = new A() { Ref = b };
var ma = Mapper.Map<MA[]>(new[]{a1, a2});
(ma[0] == ma[1]).Dump();
(ma[0].Ref == ma[1].Ref).Dump();
}
class A { public B Ref { get; set; } }
class B { }
class MA { public MB Ref { get; set; } }
class MB { }