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

Arc*_*heg 5 c# automapper

有什么方法可以让 automapper 不克隆同一个对象,而是在层次结构中多次遇到它时使用单个对象?

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

有没有办法为 AutoMapper 配置某种缓存?

我已经尝试.PreserveReferences()过 AutoMapper 配置,但这并没有达到我想要的效果。我认为这仅适用于循环引用。

更新。

我测试的代码示例.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 { }
Run Code Online (Sandbox Code Playgroud)

Luc*_*anu 5

每个 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 { }
Run Code Online (Sandbox Code Playgroud)