使用AutoMapper实现Dto和Model的自由转换(中)

注:本系列文章的代码可以在这里下载。 

在上一篇文章中我们构造出了完整的应用场景,包括我们的model、dto以及它们之间的转换规则。下面就可以卷起袖子,开始我们的automapper之旅了。 
【二】以convention方式实现零配置的对象映射 
我们的addressdto和address结构完全一致,且字段名也完全相同。对于这样的类型转换,automapper为我们提供了convention,正如它的官网上所说的: 

引用

AutoMapper uses a convention-based matching algorithm to match up source to destination values.

我们要做的只是将要映射的两个类型告诉AutoMapper(调用Mapper类的Static方法CreateMap并传入要映射的类型): 

C#代码  

Mapper.CreateMap();  

然后就可以交给AutoMapper帮我们搞定一切了: 

C#代码  

AddressDto dto = new AddressDto  

{  

    Country = “China”,  

    City = “Beijing”,  

    Street = “Dongzhimen Street”,  

    PostCode = “100001”  

};  

Address address = Mapper.Map(Dto);  

address.Country.ShouldEqual(“China”);  

address.City.ShouldEqual(“Beijing”);  

address.Street.ShouldEqual(“Dongzhimen Street”);  

address.PostCode.ShouldEqual(“100001”);  

如果AddressDto中有值为空的属性,AutoMapper在映射的时候会把Address中的相应属性也置为空: 

C#代码  

Address address = Mapper.Map(new AddressDto  

                                                       {  

                                                           Country = “China”  

                                                       });  

address.City.ShouldBeNull();  

address.Street.ShouldBeNull();  

address.PostCode.ShouldBeNull();  

甚至如果传入一个空的AddressDto,AutoMapper也会帮我们得到一个空的Address对象。 

C#代码  

Address address = Mapper.Map(null);  

address.ShouldBeNull();  

千万不要把这种Convention的映射方式当成“玩具”,它在映射具有相同字段名的复杂类型的时候还是具有相当大的威力的。 
例如,考虑我们的BookStoreDto到BookStore的映射,两者的字段名称完全相同,只是字段的类型不一致。如果我们定义好了BookDto到Book的映射规则,再加上上述Convention方式的AddressDto到Address的映射,就可以用“零配置”实现BookStoreDto到BookStore的映射了: 

C#代码  

IMappingExpression expression = Mapper.CreateMap();  

// Define mapping rules from BookDto to Book here  

Mapper.CreateMap();  

Mapper.CreateMap();  

然后我们就可以直接转换BookStoreDto了: 

C#代码  

BookStoreDto dto = new BookStoreDto  

                       {  

                           Name = “My Store”,  

                           Address = new AddressDto  

                                         {  

                                             City = “Beijing”  

                                         },  

                           Books = new List  

                                       {  

                                           new BookDto {Title = “RESTful Web Service”},  

                                           new BookDto {Title = “Ruby for Rails”},  

                                       }  

                       };  

BookStore bookStore = Mapper.Map(dto);  

bookStore.Name.ShouldEqual(“My Store”);  

bookStore.Address.City.ShouldEqual(“Beijing”);  

bookStore.Books.Count.ShouldEqual(2);  

bookStore.Books.First().Title.ShouldEqual(“RESTful Web Service”);  

bookStore.Books.Last().Title.ShouldEqual(“Ruby for Rails”);  

【三】定义类型间的简单映射规则 
前面我们看了Convention的映射方式,客观的说还是有很多类型间的映射是无法通过简单的Convention方式来做的,这时候就需要我们使用Configuration了。好在我们的Configuration是在代码中以“强类型”的方式来写的,比写繁琐易错的xml方式是要好的多了。 
先来看看BookDto到Publisher的映射。 
回顾一下前文中定义的规则:BookDto.Publisher -> Publisher.Name。 
在AutoMapperzhong,我们可以这样映射: 

C#代码  

var map = Mapper.CreateMap();  

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

AutoMapper使用ForMember来指定每一个字段的映射规则: 

引用

The each custom member configuration uses an action delegate to configure each member.

还好有强大的lambda表达式,规则的定义简单明了。 

此外,我们还可以使用ConstructUsing的方式一次直接定义好所有字段的映射规则。例如我们要定义BookDto到第一作者(Author)的ContactInfo的映射,使用ConstructUsing方式,我们可以: 

C#代码  

var map = Mapper.CreateMap();  

map.ConstructUsing(s => new ContactInfo  

                                          {  

                                              Blog = s.FirstAuthorBlog,  

                                              Email = s.FirstAuthorEmail,  

                                              Twitter = s.FirstAuthorTwitter  

                                          });  

然后,就可以按照我们熟悉的方式来使用了: 

C#代码  

BookDto dto = new BookDto  

                        {  

                            FirstAuthorEmail = “matt.rogen@abc.com”,  

                            FirstAuthorBlog = “matt.amazon.com”,  

                        };  

ContactInfo contactInfo = Mapper.Map(dto);  

如果需要映射的2个类型有部分字段名称相同,又有部分字段名称不同呢?还好AutoMapper给我们提供的Convention或Configuration方式并不是“异或的”,我们可以结合使用两种方式,为名称不同的字段配置映射规则,而对于名称相同的字段则忽略配置。 
例如对于前面提到的AddressDto到Address的映射,假如AddressDto的字段Country不叫Country叫CountryName,那么在写AddressDto到Address的映射规则时,只需要: 

C#代码  

var map = Mapper.CreateMap();  

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

对于City、Street和PostCode无需定义任何规则,AutoMapper仍然可以帮我们进行正确的映射。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2554124.html

(0)
上一篇 2025年3月6日 06:57:30
下一篇 2025年3月6日 06:57:37

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 天麻有6种人不能吃

    天麻是生活中比较常见的一种中药材,它可以起到很不错的功效与作用,适量服用有很好的保健效果,深受人们喜欢。天麻虽然有很好的食疗效果,但是不是所有人都适合吃的,比如孕妇儿童、哺乳期、过敏以及发热人群不适合吃。 天麻的禁忌人群 1、血虚 天麻属祛…

    2025年4月26日 用户投稿
    687.4K00
  • 新鲜荔枝一次最好不要超过吃几颗

    荔枝是生活中比较常见的一种水果,它含有多种营养成分,适量食用对身体有一定好处,很多人都喜欢吃荔枝。新鲜荔枝味道清甜可口,但是一次最多不要超过10颗,吃多了就会容易上火,还会容易导致肥胖等,不利于身体健康。 鲜荔枝一天最多吃几个 建议一天吃5…

    2025年4月26日
    105.6K00
  • 桑葚干可以直接嚼着吃吗

    桑葚干是生活中比较常见的一种食物,它是用新鲜的桑葚制作而成的,也含有一定的营养成分,适量食用可以起到一定的保健效果,很多人都会用桑葚干泡水喝。桑葚干是可以直接吃的,但是吸收效果没有泡水喝的效果好。 桑葚干可以直接嚼着吃吗 可以直接吃。 干桑…

    2025年4月26日
    840.1K00
  • 香榧怎么吃才好吃

    香榧是比较特别的一种坚果食品,它的样子和巴旦木比较像,外面会有一层壳,里面是坚果,含有丰富的营养成分,适量食用对身体有一定好处,香榧子的吃法也比较多,可以直接剥壳吃,也可以炒成坚果吃,还可以炸油吃等。 香榧怎么吃 1、先找到香榧一头较尖的部…

    2025年4月26日 用户投稿
    680.5K00
  • 一天吃30几个杨梅会怎么样

    杨梅是夏季比较常见的一种水果,它的果肉鲜嫩多汁,吃起来香甜可口,营养价值高,深受人们喜欢。杨梅虽然好吃,但是一次也不能吃太多,如果一次吃二三十颗,这种算是过多食用的,可能会消化不良,引起肠胃不适,或者上火等。 一天吃30几个杨梅会怎么样 虽…

    2025年4月26日
    230.3K00
  • 荔枝吃几颗是正常

    荔枝是夏季比较受欢迎的一种水果,它的果肉比较饱满,吃起来香甜可口,可以做各种各样的美食小吃,深受人们喜欢。荔枝虽然好吃,但是一次不能吃太多,通常吃一到两颗是比较正常的,最多不能超过10颗,不然就算过量食用了。 荔枝吃几颗是正常的 看个人情况…

    2025年4月26日
    595.1K00
  • 杨梅一天吃一斤一个人好吗

    杨梅是夏季比较常见的一种水果,它的吃法比较多,味道酸甜可口,营养价值高,深受人们喜欢。杨梅的吃法也是有很多的,可以直接吃果肉,也可以做饮品,还可以做甜点等,杨梅虽然好吃,但是一次不能吃太多,一个人一天不要吃一斤,这种属于过量食用。 杨梅一天…

    2025年4月26日
    428.1K00
  • 三种人不宜吃鹅蛋

    鹅蛋是生活中比较常见的一种蛋类食物,它可以起到很不错的功效与作用,适量食用对身体有一定好处,很多人都会经常吃鹅蛋,但是吃鹅蛋也有一些禁忌,并不是所有人都适合吃鹅蛋,比如蛋白质过敏的人、痛风患者以及肝炎病人等。 三种人不宜吃鹅蛋 1、蛋白质过…

    2025年4月26日
    80.1K00
  • 马卡龙什么时候吃口感最好

    马卡龙是比较受欢迎的一种甜点,它的口味比较丰富,吃起来味道很不错,很多人都喜欢吃,尤其是小孩和女性朋友们。马卡龙一般不建议在早餐期间食用,最好在下午茶的时候吃,通常马卡龙刚烤好放凉吃是最好的。 马卡龙什么时候吃口感最好 刚烤完放凉食用口感最…

    2025年4月24日
    821.8K00
  • 初伏吃什么食物好养生

    初伏是三伏天的第一个伏天,这个时候气温也是比较高的,通常会有三十多度的高温天气,比较炎热,要注意防暑降温,很多人都会通过饮食调理身体,在初伏的时候,建议吃清热解暑的食物、苦味食物以及蛋白吃高的食物等。 初伏吃什么食物好 1、多吃清热解暑、健…

    2025年4月24日
    732.1K00

发表回复

登录后才能评论