簡體   English   中英

如果遇到多次,則使automapper緩存該對象

[英]Make automapper cache the object if met more than once

是否有任何方法可以使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 { }

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM