2014-10-10 12 views
1

엔티티 모델에서 Dto로 매핑을 만들려고하는데 매핑을 만들 때마다 매번 실패합니다.중첩 된 속성이있는 모델을 평면 Dto에 매핑하려면 어떻게해야합니까?

두 개의 도메인 클래스가 있습니다. 이것은 우리의 모델의 단순화 (예를 들어 Device는 여러 가지의 무리를 대표하는 많은 특성을 가지고) :

class Device 
{ 
    public int Name {get; set;} 
} 

class DeviceAccessToken 
{ 
    public Device Device {get; set;} 
    public string Key {get; set;} 
    public string Secret {get; set;} 
} 
그때 또한 단순화이 DeviceDto (에 DeviceAccessToken 인스턴스를 매핑 할

, 그것의 대부분을 가지고 원래 Device 모델에 존재하는 필드) :

class DeviceDto 
{ 
    public int Name {get; set;} 
    public string Key {get; set;} 
    public string Secret {get; set;} 
} 

명시 적으로 매핑에 Device 도메인 모델의 모든 필드를 지정하지 않고이 매핑을 만들 수있는 방법이 있나요?

이 내가 AutoMapper 프로파일에 의해 표현, 원하는 효과적이다 : 나는 그것을 상상처럼

class DeviceMappingProfile : Profile 
{ 
    protected override void Configure() 
    { 
     this.CreateMap<DeviceAccessToken, DeviceDto>(); 

     this.CreateMap<Device, DeviceDto>() 
      .ForMember(dest => dest.Key, opt => opt.Ignore()) 
      .ForMember(dest => dest.Secret, opt => opt.Ignore()); 
    } 
} 

.ForAllMembers 호출은이 일을하려는 시도가 실패한했다, 그것은 작동하지 않을해야합니다.

DeviceAccessToken->DeviceDto 매핑에서 Device의 모든 속성을 지정하여이 작업을 수행 할 수 있음을 알고 있지만 이름이 동일하기 때문에 악몽 일 수 있으며 매우 중복됩니다.

답변

1

"매핑에서 Device 도메인 모델의 모든 필드를 명시 적으로 지정하지 않아도이 매핑을 만들 수 있습니까?"

예, Dto 개체의 명명 규칙을 사용할 수 있으며 이로 인해 만들기 맵에 입력하지 않아도됩니다. 예를 들어

:

귀하의 값 키 및 비밀 DeviceAccessTokenDeviceDto 그들이 매핑 할 필요가 없습니다 존재한다. Device은 중첩 객체이므로 사용자는 DeviceName 규칙을 사용할 수 있습니다.

예 :

using System; 
using AutoMapper; 

class Device 
{ 
    public string Name {get; set;} 
} 

class DeviceAccessToken 
{ 
    public Device Device {get; set;} 
    public string Key {get; set;} 
    public string Secret {get; set;} 
} 

class DeviceDto 
{ 
    public string DeviceName {get; set;} 
    public string Key {get; set;} 
    public string Secret {get; set;} 
} 

public class Program 
{ 
    public void Main() 
    { 

     // Configure AutoMapper 
     Mapper.CreateMap<DeviceAccessToken, DeviceDto>();  

     var dat = new DeviceAccessToken { Device = new Device { Name = "Dev Name" }, Key = "Key", Secret = "Secret" }; 

     var dto = Mapper.Map<DeviceDto>(dat); 

     Console.WriteLine(dto.DeviceName); 
     Console.WriteLine(dto.Key); 
     Console.WriteLine(dto.Secret); 
    } 
} 

Working fiddle

+0

약간의 내가있는 질문을 게시 한 후 [이 문서] (https://github.com/AutoMapper/AutoMapper/wiki/Flattening) 당신이 이야기하는이 대회를 설명하고, 지금은 그것을 사용하기로 결정했습니다. 그러나 관습에 따라 automapper가 중첩 된 속성 이름 앞에 접두어를 붙이지 않아도 속성을 인식하도록하는 방법이 있습니까? 내 경우에는 아주 비슷한 Dtos 두 개를 만들어야했는데 그 중 하나는 컨벤션을 가질 필요가 있었고 다른 하나는 그렇지 않았기 때문입니다. 어떤 곳에서는'Device'를 직접'DeviceDto'에 매핑해야합니다. 그러면 많은 일이 더 쉽게 끝날 것입니다. – julealgon

+1

@julealgon 안녕하세요, 무슨 뜻인지는 알지만 원래 질문과는 다른 것 같습니다. 나는 새로운 질문을 만들 것입니다, 당신은 더 많은 사람들이 대답하려고 노력할 것입니다. 전에 INamingConvention을 사용하여 사용자가 사용할 수있는 규칙을 변경했습니다. https://github.com/AutoMapper/AutoMapper/blob/d6eaf7025932ebedccbf8c339a155e9f4ae5c5d8/src/AutoMapper/INamingConvention.cs – hutchonoid