>  기사  >  백엔드 개발  >  AutoMapper를 사용하여 Dto와 Model 간의 무료 변환 달성(가운데)

AutoMapper를 사용하여 Dto와 Model 간의 무료 변환 달성(가운데)

巴扎黑
巴扎黑원래의
2016-12-20 11:30:281989검색

참고: 이 기사 시리즈의 코드는 여기에서 다운로드할 수 있습니다.

이전 기사에서는 모델, Dto 및 이들 간의 변환 규칙을 포함하여 완전한 애플리케이션 시나리오를 구성했습니다. 이제 소매를 걷어붙이고 AutoMapper 여행을 시작할 수 있습니다.
[2] 컨벤션 모드에서 제로 구성 객체 매핑 구현
AddressDto와 Address 구조는 정확히 동일하며 필드 이름도 정확히 동일합니다. 이러한 유형 변환을 위해 AutoMapper는 공식 웹사이트에 명시된 대로 규칙을 제공합니다.

인용

AutoMapper는 규칙 기반 일치 알고리즘을 사용하여 소스와 대상 값을 일치시킵니다.


우리가 해야 할 일은 AutoMapper에 매핑할 두 가지 유형을 알려주는 것뿐입니다(Mapper 클래스의 정적 메서드 CreateMap을 호출하고 매핑할 유형을 전달합니다).

C# 코드

Mapper.CreateMap();


그런 다음 모든 작업을 AutoMapper에 맡기면 됩니다.

C# 코드

AddressDto dto = 새 AddressDto

{

국가 = "중국",

도시 = "베이징",

거리 = "동직문 거리",

PostCode = "100001"

}

주소 주소 = Mapper.Map(Dto) ;

address.Country.ShouldEqual("중국");

address.City.ShouldEqual("베이징")

address.Street.ShouldEqual("동직문 거리 ");

address.PostCode.ShouldEqual("100001");


AddressDto에 값이 비어 있는 속성이 있으면 AutoMapper는 Address에도 해당 속성을 설정합니다. 매핑이 비어 있는 경우:

C# 코드

주소 주소 = Mapper.Map(new AddressDto

{

중국"

                                                                                 treet.ShouldBeNull( );

address.PostCode.ShouldBeNull ();

빈 AddressDto가 전달되더라도 AutoMapper는 우리를 도와줄 것입니다. 빈 Address 객체를 얻습니다.

C# 코드

주소 주소 = Mapper.Map(null)

address.ShouldBeNull();

이 컨벤션 매핑 방법을 "장난감"으로 생각하지 마십시오. 동일한 필드 이름을 가진 복잡한 유형을 매핑할 때 여전히 상당한 힘을 발휘합니다.

예를 들어 BookStoreDto와 BookStore 매핑을 생각해 보세요. 두 필드 이름은 정확히 동일하지만 필드 유형은 일관되지 않습니다. BookDto에서 Book으로의 매핑 규칙과 위의 컨벤션 방법에서 AddressDto에서 Address로의 매핑을 정의한 경우 "제로 구성"을 사용하여 BookStoreDto에서 BookStore로의 매핑을 구현할 수 있습니다.

C# 코드


IMappingExpression 식 = Mapper.CreateMap();

// BookDto에서 Book here로의 매핑 규칙 정의

Mapper . CreateMap();

Mapper.CreateMap()

그런 다음 BookStoreDto를 직접 변환할 수 있습니다.

🎜>C# 코드

BookStoreDto dto = new BookStoreDto


                                 

                         이름 = "내 매장",  

                       주소 = 새 AddressDto  

             >                                },  

                          도서 = 새 목록  

                                     {  

                                                    새 BookDto {제목 = " RESTful Web Service"},  

                                      new BookDto {Title = "Ruby for Rails"},  

                                       }

                      };  

서점 bookStore = Mapper.Map(dto);  

bookStore.Name.ShouldEqual("내 상점");  

bookStore.Address.City.ShouldEqual("베이징");  

bookStore.Books.Count.ShouldEqual(2);  

bookStore.Books.First().Title.ShouldEqual("RESTful 웹 서비스");  

bookStore.Books.Last().Title.ShouldEqual("Rails용 루비");  

【三】义类型间的简单映射规则 

앞면에서 Conventional映射方式,客观的说还是有很多类型间的映射是无法过简单의 컨벤션 방법 우리는 구성을 사용하고 있습니다. 우리의 구성은 "强类型"에 맞는 방법으로, 比写繁琐易错的xml方式是要好的多了。 

先来看看BookDto到Publisher的映射。

回顾一下前文中定义的规则:BookDto.Publisher -> 게시자.이름。 
재AutoMapperzhong,我们可以这样映射: 


C#代码  

var map = Mapper.CreateMap();  

map.ForMember(d => d.Name, opt => opt.MapFrom(s => s.Publisher));  

还好有强大 lambda表达式, 规则 의 결정에 따라 결정됩니다. 당신은 모든 것을 알고 있습니다.例如我们要定义BookDto到第一작품자(저자) 的ContactInfo的映射,使用ConstructUsing方式,我们可以: 

C#代码  

var map = Mapper.CreateMap ();  

map.ConstructUsing(s => new ContactInfo

                               블로그 = s.FirstAuthorBlog,

🎜> Twitter = s.FirstAuthorTwitter

 

BookDto dto = new BookDto

                                                                                              

FirstAuthorBlog = "matt.amazon.com",

> 두 개의 매핑된 유형에 일부 필드가 있음 이름은 동일하지만 일부 필드 이름 다른가요? 다행스럽게도 AutoMapper가 제공하는 규칙 또는 구성 방법은 "XOR"이 아닙니다. 두 방법을 조합하여 이름이 다른 필드에 대한 매핑 규칙을 구성하고 동일한 이름을 가진 필드에 대한 구성을 무시할 수 있습니다.
예를 들어 앞서 언급한 AddressDto에서 Address로의 매핑의 경우 AddressDto의 Country 필드가 Country가 아니라 CountryName이라고 하면 AddressDto에서 Address로 매핑 규칙을 작성할 때 다음만 필요합니다.

C# 코드

var map = Mapper.CreateMap()

map.ForMember(d => d.Country, opt => opt .MapFrom(s => ; s.CountryName));

도시, 거리 및 우편 번호에 대한 규칙을 정의할 필요가 없지만 AutoMapper는 여전히 올바른 매핑을 수행하는 데 도움이 될 수 있습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.