2017-10-30 1 views
2

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

원형 참조 용으로 PreserveReferences에 대한 권리가 있습니다. 당신의 질문에 관해서는, 당신이 그것을 매핑하기 시작하기 전에 당신의 컬렉션에 독특한 동작을 수행하는 것이 더 쉽고 (그리고 더 성능이 좋은) 좋지 않을까요? – hbulens

+0

@hbulens 그건 도움이되지 않습니다. 시작하기 전에 나는'[A, B, C, D ...]와 같은 객체 배열을 가지고 있는데, 모두 같은 객체'X'를 참조합니다. 이 컬렉션을 AutoMapper로 매핑하면 객체 배열'[MA, MB, MC, MD ..]'을 받지만 각 객체는 해당 [XA, XB, XC, XD ...]를 가리 킵니다. 또한 여기서 수동 작업을 많이하고 싶지는 않습니다. AutoMapper 사용의 배경은 사물을 단순화하는 것입니다. 그렇지 않으면 AutoMapper가 전혀 필요하지 않습니다. – Archeg

+0

PreserveReferences가 작동해야합니다. –

답변

2

ID는 맵 호출마다 보존됩니다.

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 }; 
    //Assert.AreNotSame(a1, a2); 
    //Assert.AreSame(a1.Ref, a2.Ref); 

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

와우! 이것은 완전히 나를 알지 못했다. 감사합니다. 완벽하게 작동합니다. – Archeg