Automapper实现自动映射的实例代码

出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用Dto(Data transfer object 数据传输对象),这样在后台往前台传递数据时可以省略不必要的信息,只保留必要的信息,大大增强数据安全性。

下面给出两个相互对应的关系模型User、UserDto

public class User
{
  private const int NameMaxLength = 20;
  private const int PassWordMaxLength = 16;
  [Key]
  public long Id { get; }
  [MaxLength(NameMaxLength)]
  public string Name { get; set; }
  [MaxLength(PassWordMaxLength)]
  [DataType(DataType.Password)]
  public string PassWord { get; set; }
}
public class UserDto
{
  private const int NameMaxLength = 20;
  private const int PassWordMaxLength = 16;
  [MaxLength(NameMaxLength)]
  public string Name { get; set; }
  [MaxLength(PassWordMaxLength)]
  public string PassWord { get; set; }
}

这里将 Id 定义为自增长主键,在注册页面,这个 Id 应不可见,这个时候使用Dto的好处就体现出来了,这个时候,在存入数据库时会涉及到 UserDto 往 User 的类型转换,按照之前的经验,肯定可以按照下面这样来写:

user.Name=userDto.Name;
user.PassWord=UserDto.PassWord;

这样的转换固然可以,但是如果一个 User 对象足够复杂,有十几个甚至二十几个属性,这个时候这种写法就会显得十分笨拙。

这个时候我们就可以借助AutoMapper来帮助我们完成 UserDto 到 User 的转换了。

首先安装Nuget包

在 Tools - Nuget Package Manage - Package Manage Console 输入

Install-Package AutoMapper 

安装相应的Nuget包。

根据 Github上给出的帮助文档来看,有两种方法可以创建映射,一种是静态的 Initalize 一种是动态创建。

下面使用两种不同的方法来进行单元测试

public void Using_Initlalize_Test()
  {
    UserDto dto = new UserDto
    {
      Name = "Niko",
      PassWord = "1234",
    };
    Mapper.Initialize(ctx => ctx.CreateMap<UserDto, User>());
    User user = Mapper.Map<UserDto, User>(dto);
    user.Name.ShouldBe("Niko");
    user.PassWord.ShouldBe("1234");
    user.Id.ToString().ShouldBe("0");
  }
  public void Using_MapperConfiguration_Test()
  {
    var config = new MapperConfiguration(ctx => ctx.CreateMap<UserDto, User>());
    var mapper = config.CreateMapper();
    // var mapper = new Mapper(config);
    UserDto dto = new UserDto
    {
      Name = "Niko",
      PassWord = "1234",
    };
    User user = mapper.Map<User>(dto);
    //User user = Mapper.Map<User>(dto);
    user.Name.ShouldBe("Niko");
    user.PassWord.ShouldBe("1234");
    user.Id.ToString().ShouldBe("0");
  }

这里使用到 Shouldly 断言框架,具体用法参考官方文档。

写完规则之后 通常会调用 AssertConfigurationIsValid 方法,检查规则是否完整

  Mapper.AssertConfigurationIsValid();

两种方法,单元测试均通过。这样的话,借助 Automapper 处理复杂的对象映射,将大大简化我们的代码量。

为了更加便捷地使用 AutoMappper ,对AutoMapper进行扩展

public static class AutoMapperExtension
{
  /// <summary>
  /// 对象到对象
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static T MapTo<T>(this object obj)
  {
    if (obj == null) return default(T);
    Mapper.Initialize(ctx=>ctx.CreateMap(obj.GetType(),typeof(T)));
    return Mapper.Map<T>(obj);
  }
  /// <summary>
  /// 集合到集合
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static List<T> MapTo<T>(this IEnumerable obj )
  {
    if (obj == null) throw new ArgumentNullException();
    Mapper.Initialize(ctx => ctx.CreateMap ( obj.GetType(), typeof(T))) ;
    return Mapper.Map<List<T>>(obj);
  }
}

使用上面的方法进行单元测试:

 public void testme()
  {
    UserDto dto = new UserDto
    {
      Name = "Niko",
      PassWord = "1234",
    };
    User user=dto.MapTo<User>();
    user.Name.ShouldBe("Niko");
    user.PassWord.ShouldBe("1234");
    user.Id.ToString().ShouldBe("0");
  }

总结

以上所述是小编给大家介绍的Automapper实现自动映射的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 五步掌握OOM框架AutoMapper基本使用

    写在前面 OOM顾名思义,Object-Object-Mapping实体间相互转换,AutoMapper也是个老生常谈了,其意义在于帮助你无需手动的转换简单而又麻烦的实体间关系,比如ViewModel和entity的转换,SearchModel和Entity的转换,我这篇分享的意义在于,网上大多数的分享都是几年前的,很多方法已经被废弃,到了编译器里会告诉你该方法已经过时,废弃的,不建议使用的,比如Mapper.CreateMap等方法,当然老司机大多数直接就去github看文档了,或者googl

  • Automapper实现自动映射的实例代码

    出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用Dto(Data transfer object 数据传输对象),这样在后台往前台传递数据时可以省略不必要的信息,只保留必要的信息,大大增强数据安全性. 下面给出两个相互对应的关系模型User.UserDto public class User { private const int NameMaxLength = 20; private const int PassWordMaxLength = 16; [Key] p

  • Mybatis结果集自动映射的实例代码

    在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType.这个时候其实就用到了Mybatis的结果集自动映射.Mybatis的自动映射默认是开启的,有需要我们也可以将其关闭(还可以调整自动映射的策略). 1       Mybatis结果集自动映射 在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType.这个时候其实就用到了Mybatis的结果集

  • iOS UIScrollView滚动视图/无限循环滚动/自动滚动的实例代码

    我们都知道UIScrollView有一种很流畅的切换效果,结合UIPageControl的辅助展示效果,就可以完成一个很不错的产品介绍功能页面.下面给大家分享iOS UIScrollView滚动视图/无限循环滚动/自动滚动功能,具体代码如下所示: <UIScrollViewDelegate> #define WIDTH [[UIScreen mainScreen] bounds].size.width #define HEIGHT [[UIScreen mainScreen] bounds].

  • c语言同名标靶点自动匹配算法实现实例代码

    1.两个标靶数据 2.匹配结果 3.代码 #include <iostream> #include <vector> #include <math.h> using namespace std; struct Point { int id; float x,y,z; Point(int _id,float _x,float _y,float _z):id(_id),x(_x),y(_y),z(_z){} }; struct Triangle { Point p1,p2,

  • C# 模拟浏览器并自动操作的实例代码

    本文主要讲解通过WebBrowser控件打开浏览页面,并操作页面元素实现自动搜索功能,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点 WebBrowser:用于在WinForm窗体中,模拟浏览器,打开并导航网页. HtmlDocument:表示一个Html文档的页面.每次加载都会是一个全新的页面. GetElementById(string id):通过ID或Name获取一个Html中的元素. HtmlElement:表示一个Html标签元素. BackgroundWorker 后台执行

  • Android实现图片自动切换功能(实例代码详解)

    在Android中图片的自动切换不仅可以实现自动切换,而且还可以使用手动切换.而且一般在切换的时候,在图片下方还带有其他内容的切换,用来标记是第几个图片的切换. 这种效果在我们日常生活中很常见,例如某宝购物,一些商城都可以使用到,用户体验度极好,今天小编就通过实例代码给大家分享android 图片自动切换功能的实现. 实现效果如下: 具体的示例代码如下: 布局代码: <?xml version="1.0" encoding="utf-8"?> <S

  • iOS实现输入框跟随键盘自动上移的实例代码

    场景还原 有些时候在包含输入框的页面中,点击输入框输入会因键盘弹起而遮挡住一部分输入框,影响用户体验.iOS在默认情况下并不会处理这种问题,不过我们可以自己实现键盘弹起输入框自动上移的效果. 实现思路 观察键盘的弹起与收回,当弹起的键盘会遮挡住输入框时,将输入框跟随键盘一并上移合适的距离,当键盘收回时,输入框回到原始状态. 具体方案 1. 注册两个观察者,观察键盘的弹起与收回 [[NSNotificationCenter defaultCenter] addObserver:self selec

  • C# 手动/自动保存图片的实例代码

    view plaincopy to clipboardprint? 复制代码 代码如下: //手动保存图片           private void saveBtn_Click(object sender, System.EventArgs e)           {               bool isSave = true;               SaveFileDialog saveImageDialog = new SaveFileDialog();          

  • Go语言实现自动填写古诗词实例代码

    前言 "白日依山尽,___".下句自然填黄河入海流,那么"日月忽其不淹兮,___,___,恐美人之迟暮",中间两句怎么填呢? 最近工作中有个需求,就是1500道语文诗词填空题没有答案,现在需要给这些题目大爷们匹配它们对应的答案,好在题目信息都很完整,指出了诗词出处.作者信息.自然想到到网上爬取对应文章信息然后字符串匹配答案.目前做完,效果还可以,基本上所有题目的答案都有了,现把操作流程记录下,做个总结. 1. 文章信息获取 网上找了很久,目前发现百度汉语对古诗词收录

  • PostgreSQL自动更新时间戳实例代码

    目录 什么是PostgreSQL时间戳数据类型? 一.为什么 二.如何做 总结 什么是PostgreSQL时间戳数据类型? 在PostgreSQL中,下一个数据类型是 TIMESTAMP ,它可以存储 TIME 和 DATE 值.但它不支持任何 时区数据.这意味着当我们转换数据库服务器的 时区时, 时间戳值将存储在数据库中,并且不能重复修改. 在PostgreSQL中,TIMESTAMP数据类型分为 两种时间数据类型,如下: timestamp timpstamptz Timestamp: :

随机推荐