automapper自动创建映射_ASP.NET Core教程:ASP.NET Core使用AutoMapper

bddfc1e8083cd99bf9c94e76b0d74cdd.png

一、前言

在实际的项目开发过程中,我们使用各种ORM框架可以使我们快捷的获取到数据,并且可以将获取到的数据绑定到对应的List中,然后页面或者接口直接显示List中的数据。但是我们最终想要显示在视图或者接口中的数据和数据库实体之间可能存在着差异,一般的做法就是去创建一些对应的“模型”类,然后对获取到的数据再次进行处理,从而满足需求。

因此,如果便捷的实现数据库持久化对象与模型对象之间的实体映射,避免在去代码中手工实现这一过程,就可以大大降低开发的工作量。AutoMapper就是可以帮助我们实现实体转换过程的工具。

二、使用AutoMapper实现实体映射

AutoMapper是一个OOM(Object-Object-Mapping)组件,从它的英文名字中可以看出,AutoMapper主要是为了实现实体间的相互转换,从而避免我们每次采用手工的方式进行转换。在没有OOM这类组件之前,如果我们需要实现实体之间的转换,只能使用手工修改代码,然后逐个赋值的方式实现映射,而有了OOM组件,可以很方便的帮助我们实现这一需求。看下面的一个例子。

首先创建一个ASP.NET Core WebApi项目:

419d1fd29c8931286651a3973781fdb8.png

添加一个Student实体类:

574b30dcca5314ba7b515a33856f2dce.png

添加StudentDTO类,跟Student属性一致。

然后添加一个类,模拟一些测试数据:

5b9c77dbec73b13f256fabf70dcb5d16.png

添加Student控制器,通过Get方法获取所有的值:

c8793c86534e3f2dd6caee0afe7c38d0.png

使用Postman进行测试:

d7646c705388940454103b20f71c9e0c.png

这样返回的数据直接就是数据库对应的实体类类型。这时需求改变了,我们要返回StudentDTO类型的数据,这时就需要修改代码:

3531914001d05f288291f2289f16afd3.png

78652d4f438a15f5f9c872f05e4f8604.png

还是使用Postman进行测试:

9b0c0960d2adcf5022052602abc29072.png

可以看到:这时返回的是DTO类型的数据。这种情况就是我们上面说的,需要手动修改代码,然后循环给对应的属性进行赋值。这里Student类只有4个属性,如果属性非常多,或者很多地方使用到了,如果还是采用这种方式进行赋值,那么就会很麻烦。假如以后其中的一个属性名称改变了,那么所有的地方也都需要修改,工作量就会很大。这时就需要使用AutoMapper解决。

首先引入AutoMapper包,直接在NuGet中引入:

b000813be1f868beb4ed1f9d8de8b904.png

这里选择安装AutoMapper.Extensions.Microsoft.DependencyInjection这个包。这个包主要是为了让我们可以通过依赖注入的方式去使用AutoMapper。

新建StudentProfile类,继承自AutoMapper的Profile类,在无参构造函数中,我们就可以通过 CreateMap 方法去创建两个实体间的映射关系。

c846ca235d9db34c45c4a81bc4929634.png

这里的 Profile有什么用呢?services.AddAutoMapper他会自动找到所有继承了Profile的类然后进行配置。

然后修改Student控制器,通过构造函数使用AutoMapper的注入,并使用AutoMapper实现自动映射:

07b991717b339d385d5ac05e3e4d1afb.png

8ccdd0eda1c6ff7ce496377dc4267b23.png

修改Startup类的ConfigureServices方法,添加AutoMapper:

d9ea8eedf83518c5f04f65cdf5ce89af.png

再次使用Postman进行测试:

fd14092753d1a67bc8006747737999ae.png

可以看到,这样也实现了我们的需求,而且还不需要进行手动映射。

上面的示例中,Student和StudentDTO类里面的属性名称都是一样的,如果属性名称不一样呢?我们把StudentDTO类里面的ID改为StudentID,然后修改映射代码:

f6af480801b63cd657d9bbb35e656baa.png

再次使用Postman进行测试:

ea5d3dadb50f56441e94256304f2c960.png

这样就实现了自定义映射。这里是映射了一个字段,如果是多个字段不同呢? 修改StudentDTO类:

f5fe5c71715be039f3121c4104ca5765.png

然后修改映射配置类:

0dd5f7227bf3a8cb93c2540553eab9de.png

在使用Postman进行测试:

8b4714d40f7011c12499a2be53176205.png

这样就实现了多个属性的自定义映射。 

上面的实例中是从Student映射到StudentDTO,那么可以从StudentDTO映射到Student吗?答案是肯定的,只需要在映射的最后使用ReverseMap()方法即可:

3d016f5195f2e4d382d238343fc6faba.png

我们修改Data,里面增加一个Add方法,可以将Student添加到集合中:

a42c9f42dc82a0329747639b1856d46b.png

修改Student控制器,添加一个Post方法,传入的参数的StudentDTO类型:

2b8dc17279d004bea37252bef2cdab2d.png

c21ec42932899b5725c9933666ed24a5.png

c35a935052f4e65712ba0b59ac77d157.png

使用Postman进行测试:

7bc33648a6c252c651267fad4d2ecd21.png

返回结果:

9d0b9ccd0e0a09ea7e33eb411284d92c.png

这样就实现了映射的反转。

292433822854c269ece13ef6498142d2.png

欢迎关注“新阁上位机编程”抖音号

不定期发布上位机实用小技巧哦

快来学习互粉呀~dfd43aaed560cf440a518f1addc9785a.png

(长按下方图片?保存到手机相册,打开抖音扫码关注哦!相信你肯定会688c93780d36322b1110f4b6f3347580.png)

e1e123c2c46f54b51d8f9663b05044d1.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值