如果遇到多次,则使automapper缓存该对象

时间:2017-10-30 13:55:20

标签: c# automapper

有没有办法让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 { }

1 个答案:

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