속성 이름이 다른 경우 매핑 규칙을 지정하는 방법


144

저는 Automapper 프레임 워크의 초보자입니다. 다음과 같이 도메인 클래스와 DTO 클래스가 있습니다.

public class Employee
{
   public long Id {get;set;}
   public string Name {get;set;}
   public string Phone {get;set;}
   public string Fax {get;set;}
   public DateTime DateOfBirth {get;set;}
}

public class EmployeeDto
{
   public long Id {get;set;}
   public string FullName {get;set;}
   public DateTime DateOfBirth {get;set;}
}

참고 : 클래스의 " Name " 속성 이름Employee클래스의 " FullName " 속성 이름 과 다릅니다 EmployeeDto.

다음은 Employee객체를 매핑하는 코드입니다 EmployeeDto.

Mapper.CreateMap<Employee, EmployeeDto>(); // code line (***)
EmployeeDto dto = Mapper.Map<Employee, EmployeeDto>(employee); 

내 질문은 : Employee(소스 클래스)를 EmployeeDto(대상 클래스)에 매핑하려면 매핑 규칙을 어떻게 지정할 수 있습니까? 다시 말해, 위의 코드 줄 (***)로 어떻게 더 많은 것을해야합니까?

답변:


292

신경 쓰지 마라. 나는 스스로 해결책을 찾았다.

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));

1
접두사 / 접미사와 같은 클래스에 대해 전역 적으로 지정하는 방법이 있습니까? 예를 들어, 각각 "Localizations"속성이있는 라이브러리에는 많은 클래스가 있습니다. 그리고 해당 속성이 "LocalizedName"이라는 클래스에 매핑하고 싶습니다. 내 유일한 옵션은 ForMember를 각 매핑 구성에 추가하는 것입니까?
NickAb

2
매퍼 클래스에는 CreateMap 메소드가 없습니다 :(
Navid_pdp11

3
@ Navid_pdp11 네 있습니다. 정적 클래스 매퍼가 인스턴스가 아니어야 함
Jordy van Eijk

@JordyvanEijk 정적 "CreateMap"메소드가있는 버전을 사용하고 있습니까? 5.1.1.0에는 그런 것이 없습니다
Matt Thomas

6
@MattThomas automapper의 github을 살펴본 후 버전 5.0 CreateMap이 더 이상 사용되지 않으며 MapperConfiguration 또는 Mapper.Initialize를 사용해야한다고 말합니다.
Jordy van Eijk

7

Automapper 8.1 이상을 사용하여 위의 주석을 업데이트 된 접근 방식으로 롤링하십시오 ...

var mapConfig = new MapperConfiguration(
   cfg => cfg.CreateMap<Employee, EmployeeDto>()
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
);

그런 다음 mapConfig를 사용하여 매퍼를 빌드합니다.

var mapper = mapConfig.CreateMapper();

2

매핑을 위해 클래스 속성을 지정할 수도 있습니다

에서 https://docs.automapper.org/en/stable/Conventions.html#attribute-support

속성 지원

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * 현재는 항상 켜져 있습니다

속성 / 필드에 대한 SourceToDestinationMapperAttribute 인스턴스를 찾고 사용자 정의 isMatch 함수를 호출하여 멤버 일치를 찾습니다.

MapToAttribute는 제공된 이름을 기준으로 속성과 일치하는 것 중 하나입니다.

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}

다른 곳에서 내용을 그대로 인용하는 경우 블록 인용 형식을 사용하여 내용이 복사되었음을 독자에게 분명히 알리십시오.
TylerH

새로운 스타일을 확인하십시오 :) docs.automapper.org/en/latest/Attribute-mapping.html
Lucian Bargaoanu

stackoverflow에 매우 새로운 기능입니다. 물론 @TylerH
Pranay DevOps
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.