ASP.Net Core Webapi使用AutoMapper

ASP.Net Core使用AutoMapper

前言

原文博客链接
由于CSDN界面越来越烂,因此自己搭建了一个博客网站,上面的链接是我自己的个人博客网站地址,希望大家可以去上面阅读我的文章,CSDN只是用来备份数据

http://www.lizhenghao.site/blog/2022/01/12/152

个人的博客首页:

博客首页

AutoMapper的作用

在Webapi中如果我们不使用AutoMapper,在接收参数后我们如果需要存入数据库中,需要这样写

public IActionResult Inser(UserParam param)
{
    UserModel model=new UserModel();
    model.user_name=param.userName;
    model.pass_word=param.password;
    model.phone=param.phone;
    model.address=param.address;
    DBClient.Insert(model);
}

像上面这样的操作我们通常需要写很多遍,重复劳动非常多,而使用了AutoMapper之后,我们只需要写这样的代码

public IActionResult Inser(UserParam param)
{
    UserModel model=_mapper.Map(param);
    DBClient.Insert(model);
}

是不是非常省事?

虽然在映射的时候非常爽,但是配置文件写起来还是挺麻烦的,只能说有利有弊吧

如何使用?

新建一个Webapi项目,打开nuget安装这两个:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l6JHx7hg-1642328359889)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220116180409430.png)]

安装完了之后新建一个配置类ModelMapper

 public class ModelMapper:Profile
 {
     public ModelMapper()
     {
         MapperForUser();
     }

     private void MapperForUser()
     {
         // ReverseMap允许双向映射
         CreateMap()
             .ForMember(d => d.id, dst => dst.MapFrom(s => s.Id))
             .ForMember(d => d.username, dst => dst.MapFrom(s => s.user_name))
             .ForMember(d => d.nickname, dst => dst.MapFrom(s => s.nick_name))
             .ForMember(d => d.privilageLevel, dst => dst.MapFrom(s => s.privilage_level)).ReverseMap();
     }
 }
  1. 这里的TUser为数据库对应的实体类,UserParam为webapi接口接收的参数
  2. ForMember用于特定属性的映射
  3. CreateMap第一个是Source类,第二个是Target类,顺序不能反(用了ReverseMap此条忽略)
  4. ReverseMap用于双向映射,就是Source到Target和Target到Source都是可以映射的

然后在Startup中注册服务:

services.AddAutoMapper(typeof(ModelMapper));

然后在controller中这样用:

private readonly IMapper _mapper;
// 构造函数依赖注入
public UserController(IMapper mapper)
{

    this._mapper = mapper;

}
[HttpPost]
public ResponseResult InsertUser(UserPrams user)
{
    // 根据之前的配置文件映射
    var userModel=_mapper.Map(user);
    userModel.Id = SnowFlakeSingle.instance.getID();//单条插入返回雪花ID
    var res=_userService.Insert(userModel);
    return new ResponseResult() { success = res };
}

和Json序列化的对比

我个人认为用Automapper在映射的时候虽然挺方便的,但是配置文件写起来还是比较麻烦,在不用AutoMapper之前我都是用Json进行序列化再反序列化,用Json的好处有以下几点

  1. 不需要写配置文件
  2. 映射的时候自动忽略大小写

当然缺点也有,我想了一下,主要问题就在于

  1. 性能有差距,差距还比较大
  2. 在属性名不一样的情况下无法映射,且没办法做一些定制性的映射

关于性能方面,我自己简单测试了一下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmunppI1-1642328359890)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220116181215173.png)]

这里Json序列化用的是NewtonSoft.Json库,可以看出性能差距基本上有快几十倍了,序列化10000个只有4个属性的对象,json只需要50毫秒,AutoMapper只需要1-2毫秒,虽然两个都挺快的…

对于我来说的话,不是特别需求性能,且偷懒的情况话还是直接用Json序列化吧,简单,效率也还行

你可能感兴趣的:(C#,asp.net,后端,microsoft)