2016-08-01 5 views
3

Automapper v3에서 작동하지만 아래 버전에서는 더 이상 v5를 사용하지 않습니다. UPDATE v4에서도 작동합니다.Automapper v5 업그레이드 후 빈 속성 값

CallScheduleProfiletrue 값을 전달하는 클래스의 인스턴스에 Title 속성을 설정합니다. 생성자의

CallScheduleProfileViewModeltrue"Title" 값을 전달하는 다른 클래스의 인스턴스에 Title 속성을 설정한다.

모든 4 개의 클래스에 대해 AutoMapper에서 매핑을 설정 한 다음 Map을 호출합니다.

결과는 CallScheduleProfileViewModel의지도 후 Title 속성이 true의 부울을 가지고 있지만 FriendlyName는이 생성자에 설정되어 있더라도 비어 있다는 것입니다. 나는 무슨 일이 일어나고 무엇을 믿는

CallScheduleProfileViewModel에 생성자가 호출되고 있으며 FriendlyName 할당지고하지만 매핑이 발생하는 경우가 Entry의 생성자를 호출하고 존재하는 UxEntry에 어떤 속성을 매핑하고 할당한다는 것입니다 그 Title에 속성 및 기본적으로 FriendlyName은 null이되며 FriendlyNameUxEntry에 없기 때문에 값이 복사되지 않습니다.

나는 그 가정에서 틀릴 수도 있지만 어느 쪽이든 어떻게 FriendlyName이 매핑에 채워지나요?

업데이트 : 중첩 된 유형의 Automapper documentation을 살펴 봤는데 문제는 문서에도 제공된 코드와 함께 존재합니다. InnerDest에 문자열 속성을 추가하고 OuterDest 생성자에 해당 값을 설정하면 Map 값이 null입니다. 유형 Entry<T>에 대한 null

B) Automapper는 (후 Entry<T>의 새로운 인스턴스를 생성이 속성을 설정

A) 생성자) : 때문에

public static void Main(string[] args) 
{ 
    Mapper.Initialize(cfg => 
    { 
     cfg.CreateMap<UxEntry<bool>, Entry<bool>>(); 

     cfg.CreateMap<CallScheduleProfile, CallScheduleProfileViewModel>(); 
    }); 

    var old = new CallScheduleProfile(); 

    var newmodel = Mapper.Map<CallScheduleProfile, CallScheduleProfileViewModel>(old); 

    Console.WriteLine(newmodel.Title.Value); 
    Console.WriteLine(newmodel.Title.FriendlyName); 
} 

public class UxEntry<T> 
{ 
    public static implicit operator T(UxEntry<T> o) 
    { 
     return o.Value; 
    } 

    public UxEntry() 
    { 
     this.Value = default(T); 
    } 

    public UxEntry(T value) 
    { 
     this.Value = value; 
    } 

    public T Value { get; set; } 
} 


public class CallScheduleProfile 
{ 
    public CallScheduleProfile() 
    { 
     this.Title = new UxEntry<bool>(true); 
    } 

    public UxEntry<bool> Title { get; set; } 

} 

public class Entry<T> 
{ 
    public Entry() 
    { 
    } 

    public Entry(T value, string friendlyName) 
    { 
     this.Value = value; 
     this.FriendlyName = friendlyName; 
    } 

    public T Value { get; set; } 
    public string FriendlyName { get; set; } 

    public static implicit operator T(Entry<T> o) 
    { 
     return o.Value; 
    } 
} 


public class CallScheduleProfileViewModel 
{ 
    public CallScheduleProfileViewModel() 

    { 
     this.Title = new Entry<bool>(true, "Title"); 
    } 
    public Entry<bool> Title { get; set; } 
} 

답변

0

음, Automappernull이 속성을 매핑! CallScheduleProfileViewModel의 생성자가 호출됩니다.

C) Automapper

설정 다른 규칙이 없습니다

당신이 여기에서 할 수있는 것은 당신이 Automapper이 속성 중 하나에 사용되는 기본 값이 있어야 있음을 알려 있도록 설정을 변경하는 것입니다

 Mapper.Initialize(cfg => 
     { 
      // when UxEntry is mapped to Entry value "Title" is used for property FriendlyName 
      cfg.CreateMap<UxEntry<bool>, Entry<bool>>() 
       .ForMember(dest => dest.FriendlyName, opt => opt.UseValue("Title")); 

      cfg.CreateMap<CallScheduleProfile, CallScheduleProfileViewModel>(); 
     }); 

이제 생성자에서 중복 속성 초기화를 CallScheduleProfileViewModel에 제거 할 수 있습니다.

true  
Title 
+0

실제로 발견'CFG : 다른 변경하지 않고 코드를 실행

출력에 따라 생산하고 있습니다.CreateMap (). ForMember (dest => dest.Title, o => o.UseDestinationValue()); 또한 – Jon

+0

@Jon 와우, 잘 했어 ... – Fabjan

관련 문제