2017-11-29 9 views
1

AutoMapper에서 기본 대상 매핑을 만들 수 있습니까?AutoMapper에서 상속 된 클래스의 기본 매핑 구성

소스 클래스 :

class SourceA { 
    public string X { get; set; } 
} 
class SourceB { 
    public string Y { get; set; } 
} 

대상 클래스 :

class DestBase { 
    public List<string> Z { get; set; } 
} 
class DestA : DestBase { 
    public string X { get; set; } 
} 
class DestB : DestBase { 
    public string Y { get; set; } 
} 

그리고 매핑 구성은 다음이 포함

cfg.CreateMap<SourceA, DestA>() 
    .ForMember(dest => dest.Z, src => src.MapFrom(s => null)); 
cfg.CreateMap<SourceB, DestB>() 
    .ForMember(dest => dest.Z, src => src.MapFrom(s => null)); 

모든 대상에 대한 기본 매핑을 만들 수 있습니다 상속받은 클래스 DestBase을 반복하여 피하기 위해 .ForMember(...) 라인?

예 : 같은 : 원칙적으로

cfg.CreateMap<object, DestBase> 
    .ForMember(dest => dest.Z, src => src.MapFrom(s => new List<string>())); 

답변

2

은 예, Include 방법,하지만주의가있다.

소스 유형 object에서 맵을 정의하면이 맵은 모든 유형과 일치합니다. 이 맵핑의 영향을 ^는 소스 유형에 대해 ISource 인터페이스를 도입 할 수 있습니다.

그래서 같이 수 : 여전히 매핑 할 추가 속성이없는 경우에도, 모든 유형을 포함에 대한지도를 작성해야

class SourceA : ISource { 
     public string X { get; set; } 
    } 

    class SourceB : ISource { 
     public string Y { get; set; } 
    } 

    cfg.CreateMap<ISource, DestBase> 
     .Include<SourceA, DestA> 
     .Include<SourceB, DestB> 
     .Include<SourceC, DestC> 
     .ForMember(dest => dest.Z, , o => o.MapFrom(src => new List<string>())); 

    cfg.CreateMap<SourceA, DestA>() 
     .ForMember(dest => dest.X, o => o.MapFrom(src => src.X)); 

    cfg.CreateMap<SourceB, DestB>() 
     .ForMember(dest => dest.Y, o => o.MapFrom(src => src.Y)); 

    // still need to create a map even if no additional properties are to be mapped 
    cfg.CreateMap<SourceC, DestC>(); 

참고.

+0

내 원본 개체가 다른 사람들에게 노출되어 멋지고 깨끗하게 보여야합니다. 모든 목적지 클래스가 'DestBase'클래스로부터 (현재) 상속 받고있는 것은 아니며 따라서 소스 클래스가 (더미) 인터페이스를 구현해야하는 것은 아닙니다. 하지만 다른 솔루션을 사용할 수 없다면 문제가 해결 될 수도 있습니다 ... 내가 테스트 해 보겠습니다 ... –

+0

불행히도, Include를 사용하려면 공통 소스 유형 또는 인터페이스가 필요합니다. –