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 { }
원형 참조 용으로 PreserveReferences에 대한 권리가 있습니다. 당신의 질문에 관해서는, 당신이 그것을 매핑하기 시작하기 전에 당신의 컬렉션에 독특한 동작을 수행하는 것이 더 쉽고 (그리고 더 성능이 좋은) 좋지 않을까요? – hbulens
@hbulens 그건 도움이되지 않습니다. 시작하기 전에 나는'[A, B, C, D ...]와 같은 객체 배열을 가지고 있는데, 모두 같은 객체'X'를 참조합니다. 이 컬렉션을 AutoMapper로 매핑하면 객체 배열'[MA, MB, MC, MD ..]'을 받지만 각 객체는 해당 [XA, XB, XC, XD ...]를 가리 킵니다. 또한 여기서 수동 작업을 많이하고 싶지는 않습니다. AutoMapper 사용의 배경은 사물을 단순화하는 것입니다. 그렇지 않으면 AutoMapper가 전혀 필요하지 않습니다. – Archeg
PreserveReferences가 작동해야합니다. –