如果多次遇到对象,则使自动映射器缓存对象



有没有办法让自动映射器不克隆同一个对象,而是在层次结构中多次遇到单个对象时使用单个对象?

基本上,我有一大堆不同的对象,它们都引用同一个对象。当我使用 AutoMap per 映射此集合时,它会生成一个对象数组,其中每个对象都引用一个新的克隆对象。所有这些克隆的对象在引用上不再相等。这最终导致我的内存不足问题。

有没有办法为自动映射器配置某种缓存?

我已经在自动映射器配置中尝试了.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 { }

每个映射调用都会保留标识。

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 { }

最新更新