2012-06-21 3 views
25

오늘 AutoMapper v1.1을 사용하여 완전히 작동하는 응용 프로그램을 업그레이드하여 현재 AutoMapper v2.1을 사용하고 있으며 이전 버전을 사용하면서 결코 만난 적이없는 몇 가지 문제를 다룰 것입니다. 나는 2.1로 발생하는 첫 번째 문제가 있었다 그러나 여기 잘못된 생성자를 사용하는 AutoMapper

는 ... 다시 에서 DTO 도메인 객체

public class TypeOne 
{ 
    public TypeOne() 
    { 
    } 

    public TypeOne(TypeTwo two) 
    { 
     //throw ex if two is null 
    } 

    public TypeOne(TypeTwo two, TypeThree three) 
    { 
     //throw ex if two or three are null 
    } 

    public TypeTwo Two {get; private set;} 

    public TypeThree Three {get; private set;} 
} 

public class TypeOneDto 
{ 
    public TypeOneDto() 
    { 
    } 

    public TypeTwoDto Two {get; set;} 

    public TypeThreeDto Three {get; set;} 
} 

Mapper.CreateMap<TypeThreeDto, TypeThree>(); 
Mapper.CreateMap<TypeTwoDto, TypeTwo>(); 
Mapper.CreateMap<TypeOneDto, TypeOne>(); 

var typeOne = Mapper.Map<TypeOne>(typeOneDto); 

내 코드 매핑의 예입니다 args 중 하나가 null이고 1 arg 생성자를 사용해야하는 경우 AutoMapper는 2 개의 args로 생성자를 사용하려고했습니다.

나는 다음
Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(x => new TypeOne()); 

을 사용하려고하지만 내가 해결할 수있는 '모호한 호출'오류가 있었다.

나는 다음
Mapper.CreateMap<TypeOneDto, TypeOne>().ConvertUsing(x => new TypeOne()); 

을 시도하고 성공적으로 매개 변수가없는 생성자를 사용하여 TypeOne 객체를 생성 않았지만 다음은 개인 setter 속성을 설정하지 못했습니다.

AutoMapper 웹 사이트에서 도움을 요청하고 소스 코드를 다운로드하여 좋은 모양으로 만들었지 만 작은 설명서가 없기 때문에 ConstructUsing에 대한 단위 테스트가 많지 않았습니다.

v2.1에서 변경해야 할 사항이 없습니까? 나는 그것이 v1.1에서 많이 변한 것에 놀랐다.

+0

가능한 중복 (http://stackoverflow.com/questions/2239143/automapper-how-to-map-to-constructor-parameters- 대신에 속성 설정자) –

+0

"ConstructUsing"을 사용할 때 위에 언급 한 동일한 오류가 계속 발생합니다. 매개 변수가없는 생성자로 새 객체를 만들 때 "모호한 호출". –

답변

48

당신은 단지

여기
Func<ResolutionContext, TypeOne> 

explicit cast를 추가해야하는 코드입니다 :

  1. 정렬 대상 유형 생성자 : AutoMapper의

    Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(
          (Func<ResolutionContext, TypeOne>) (r => new TypeOne())); 
    

    현재 버전 아래에 설명 된대로 작동 매개 변수 개수에 따라

    destTypeInfo.GetConstructors().OrderByDescending(ci => ci.GetParameters().Length); 
    
  2. 소스 속성과 매개 변수가 일치하는 첫 번째 생성자 (null 값 확인 필요 없음)를 취합니다. 귀하의 경우에는 두 개의 매개 변수를 사용하는 생성자입니다.

[Automapper - 생성자 매개 변수 대신 속성 세터에 매핑하는 방법]의
+0

이것은 단지 나에게 슬픔을 덜어 줬다. AutoMapper (3.2.1.0)의 최신 버전에서 완벽하게 작동합니다. :) 감사합니다! – Stu1986C

+3

이것은 상당히 오래된 글이지만 발견했기 때문에 기쁩니다. AutoMapper가 생성자와 일치하는 것으로 간주하는 순서가 버전 4에서 다시 변경된 것 같습니다.0.4. 문제를 피하기 위해, 하나 이상의 생성자가있는 경우 AutoMapper가 사용할 생성자를 항상 지정하는 것이 더 보수적 인 방법 일 수 있습니다. 또한 두 번째 권장 사항으로 모든 맵을 설정하는 자동 테스트를 실시한 다음 Mapper.AssertConfigurationIsValid()를 호출하십시오. 그렇게하면 일찍 문제를 해결할 수 있습니다. 해피 코딩! – Manfred

관련 문제