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

在实际的软件开发项目中,我们的“业务逻辑”常常需要我们对同样的数据进行各种变换。例如,一个web应用通过前端收集用户的输入成为dto,然后将dto转换成领域模型并持久化到数据库中。另一方面,当用户请求数据时,我们又需要做相反的工作:将从数据库中查询出来的领域模型以相反的方式转换成dto再呈现给用户。有时候我们还会面临更多的数据使用需求,例如有多个数据使用的客户端,每个客户端都有自己对数据结构的不同需求,而这也需要我们进行更多的数据转换。 
频繁的数据转换琐碎而又凌乱,很多时候我们不得不: 
(1)在两个类型几乎只是名字不同而结构大体相似,却只能以手工的、逐个属性赋值的方式实现数据在类型间的“传递”。 
(2)每遇到一个新的数据转换场景就手动实现一套转换逻辑,导致数据转换操作重复而又分散到应用的各个角落。 
如果有这样一个“变形金刚”般的工具,把“橘子”变成我们想要的“苹果”,而我们需要做的只是定义好转换规则——做我们真正的业务逻辑,或者甚至在简单场景下连规则都不需要定义(convention over configuration),那将会是非常美好的事情。事实上在.net中我们不用重复发明轮子,因为我们有——automapper,一个强大的object-object mapping工具。 
好吧,我承认自己有一点小小的激动,事实上我所做的项目正在经历以上的“困惑”,而automapper确实带给我眼前一亮的感觉。因此我花了一点周末休息时间小小尝试了一把automapper,通过做小的应用场景实现dto到领域模型的映射,确实感觉到了它的“强大气场”。我将在文章中分享自己的使用心得,希望能给同样处于困惑中的你带来一点帮助。完整的项目代码我会在晚一些时候发布到自己的git repository中,欢迎大家自由参考使用。 
【一】 应用场景说明 
先来看看我所”虚拟“的领域模型。这一次我定义了一个书店(bookstore): 

C#代码  

public class BookStore  

{  

    public string Name { get; set; }  

    public List Books { get; set; }  

    public Address Address { get; set; }  

}  

书店有自己的地址(Address): 

C#代码  

public class Address  

{  

    public string Country { get; set; }  

    public string City { get; set; }  

    public string Street { get; set; }  

    public string PostCode { get; set; }  

}  

同时书店里放了n本书(Book): 

C#代码  

public class Book  

{  

    public string Title { get; set; }  

    public string Description { get; set; }  

    public string Language { get; set; }  

    public decimal Price { get; set; }  

    public List Authors { get; set; }  

    public DateTime? PublishDate { get; set; }  

    public Publisher Publisher { get; set; }  

    public int? Paperback { get; set; }  

}  

每本书都有出版商信息(Publisher): 

C#代码  

public class Publisher  

{  

    public string Name { get; set; }  

}  

每本书可以有最多2个作者的信息(Author): 

C#代码  

public class Author  

{  

    public string Name { get; set; }  

    public string Description { get; set; }  

    public ContactInfo ContactInfo { get; set; }  

}  

每个作者都有自己的联系方式(ContactInfo): 

C#代码  

public class ContactInfo  

{  

    public string Email { get; set; }  

    public string Blog { get; set; }  

    public string Twitter { get; set; }  

}  

差不多就是这样了,一个有着层级结构的领域模型。 
再来看看我们的Dto结构。 
在Dto中我们有与BookStore对应的BookStoreDto: 

C#代码  

public class BookStoreDto  

{  

    public string Name { get; set; }  

    public List Books { get; set; }  

    public AddressDto Address { get; set; }  

}  

其中包含与Address对应的AddressDto: 

C#代码  

public class AddressDto  

{  

    public string Country { get; set; }  

    public string City { get; set; }  

    public string Street { get; set; }  

    public string PostCode { get; set; }  

}  

以及与Book相对应的BookDto: 

C#代码  

public class BookDto  

{  

    public string Title { get; set; }  

    public string Description { get; set; }  

    public string Language { get; set; }  

    public decimal Price { get; set; }  

    public DateTime? PublishDate { get; set; }  

    public string Publisher { get; set; }  

    public int? Paperback { get; set; }  

    public string FirstAuthorName { get; set; }  

    public string FirstAuthorDescription { get; set; }  

    public string FirstAuthorEmail { get; set; }  

    public string FirstAuthorBlog { get; set; }  

    public string FirstAuthorTwitter { get; set; }  

    public string SecondAuthorName { get; set; }  

    public string SecondAuthorDescription { get; set; }  

    public string SecondAuthorEmail { get; set; }  

    public string SecondAuthorBlog { get; set; }  

    public string SecondAuthorTwitter { get; set; }  

}  

注意到我们的BookDto”拉平了“整个Book的层级结构,一个BookDto里携带了Book及其所有Author、Publisher等所有模式的数据。 
正好我们来看一下Dto到Model的映射规则。 
(1)BookStoreDto -> BookStore 

BookStoreDto中的字段    BookStore中的字段    

Name    Name    

Books    Books    

Address    Address    

(2)AddressDto -> Address 

AddressDto中的字段    Address中的字段    

Country    Country    

City    City    

Street    Street    

PostCode    PostCode    

(3)BookDto -> Book。 
BookDto中的一些基本字段可以直接对应到Book中的字段。 

BookDto中的字段    Book中的字段    

Title    Title    

Description    Description    

Language    Language    

Price    Price    

PublishDate    PublishDate    

Paperback    Paperback    

每本书至多有2个作者,在BookDto中分别使用”First“前缀和”Second“前缀的字段来表示。因此,所有FirstXXX字段都将映射成Book的Authors中的第1个Author对象,而所有SecondXXX字段则将映射成Authors中的第2个Author对象。 

BookDto中的字段    Book中的Authors中的第1个Author对象中的字段    

FirstAuthorName    Name    

FirstAuthorDescription    Description    

FirstAuthorEmail    ContactInfo.Email    

FirstAuthorBlog    ContactInfo.Blog    

FirstAuthorTwitter    ContactInfo.Twitter    

注意上表中的ContactInfo.Email表示对应到Author对象的ContactInfo的Email字段,依次类推。类似的我们有: 

BookDto中的字段    Book中的Authors中的第2个Author对象中的字段    

SecondAuthorName    Name    

SecondAuthorDescription    Description    

SecondAuthorEmail    ContactInfo.Email    

SecondAuthorBlog    ContactInfo.Blog    

SecondAuthorTwitter    ContactInfo.Twitter    

最后还有Publisher字段,它将对应到一个独立的Publisher对象。 

BookDto中的字段    Publisher中的字段    

Publisher    Name    

差不多就是这样了,我们的需求是要实现这一大坨Dto到另一大坨的Model之间的数据转换。

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

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

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

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

发表回复

登录后才能评论