出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用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的好处就体现出来了,这个时候,在存入数据库时会涉及到 UserDtoUser 的类型转换,按照之前的经验,肯定可以按照下面这样来写:

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

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

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

首先安装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实现自动映射的更多相关文章

  1. Automapper 实现自动映射

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

  2. AutoMapper自动映射

    十年河东,十年河西,莫欺少年穷. 学无止境,精益求精. 不扯犊子,直接进入正题: AutoMapper自动映射常用于EF中,能很好的解决DTO和Model之间相互映射的问题.在未使用AutoMappe ...

  3. automapper 自动映射 集成asp.net Core2.1

    学习博文:https://www.cnblogs.com/yan7/p/8085410.html 1.使用nuget 安装 <PackageReference Include="Aut ...

  4. 【来龙去脉系列】AutoMapper一款自动映射框架

    前言 通常在一个应用程序中,我们开发人员会在两个不同的类型对象之间传输数据,通常我们会用DTOs(数据传输对象),View Models(视图模型),或者直接是一些从一个service或者Web AP ...

  5. TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE

    TransactionScope事务处理方法介绍及.NET Core中的注意事项   作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.ht ...

  6. ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射

    本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...

  7. ASP.NET CORE 中使用AutoMapper进行对象映射

    ASP.NET CORE 中使用AutoMapper进行对象映射 1.什么是AutoMapper? AutoMapper是基于对象到对象约定的映射工具,常用于(但并不仅限制于)把复杂的对象模型转为DT ...

  8. 打造强大的BaseModel(2):让Model实现自动映射,将字典转化成Model

    打造强大的BaseModel(1):让Model自我描述 这篇文章将讲述Model一项更高级也最常用的功能,让Model实现自动映射–将字典转化成Model(所有代码全由Swift实现) 将JSON转 ...

  9. 反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射

    简单粗暴,直奔主题.   需求:通过自定义注解和反射技术,将Excel文件中的数据自动映射到pojo类中,最终返回一个List<pojo>集合? 今天我只是通过一位使用者的身份来给各位分享 ...

随机推荐

  1. ARP地址解析协议原理

    概述 网络层以上的协议用IP地址来标识网络接口,但以太数据帧传输时,以物理地址来标识网络接口.因此我们需要进行IP地址与物理地址之间的转化. 对于IPv4来说,我们使用ARP地址解析协议来完成IP地址 ...

  2. Install Tomcat 6 on CentOS or RHEL --转载

    source:http://www.davidghedini.com/pg/entry/install_tomcat_6_on_centos This post will cover installa ...

  3. elasticsearch启动错误解决

    es启动默认不能使用root用户,所以需要新创建一个用户来启动. 启动时可能出现的问题: [1]: max file descriptors [4096] for elasticsearch proc ...

  4. shallot夏洛特

    ================================================================= ================================== ...

  5. .net core 2.2 部署CentOS7(1)安装虚拟机

    目录: .net core 2.2 部署CentOS7(1)安装虚拟机 .net core 2.2 部署CentOS7(2)给虚拟机安装CentOS7 .net core 2.2 部署CentOS7( ...

  6. 控制器pop时没有被销毁(没有走dealloc方法)错误原因

    ARC环境下,不需要我们进行过多的内存的管理我们需要做的就是在dealloc方法中进行内存管理,但是错误的代码也会造成内存管理方法dealloc不执行,错误的原因无非以下三种,其中第二种和第三种最容易 ...

  7. HDU 4279 Number-------找规律题

    Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  8. Unity3d之MonoBehavior自带方法的执行顺序

    首先贴一张图(从其他地方摘录的,不记得出处,如果有小伙伴知道可以评论留言) 看了以后脑子有个大概的概念,可还是一知半解的感觉(接触Unity也有2年之久,却从来没想过弄清楚心中这团迷雾,总是囫囵吞枣用 ...

  9. MVC 客户端(Memo = "<img src="http://">")中检测到有潜在的危险的 Request.Form 值 的解决方案

    解释定义:ASP.NET为了阻止跨站脚本攻击,会对向服务器端输入的HTML代码进行防御措施,在使用.NET MVC中,可以对validateinput属性设置,但是,有时需要ASP.NET临时关闭这个 ...

  10. 【学习笔记】--- 老男孩学Python,day14 python内置函数大全

    参考:  https://www.cnblogs.com/pyyu/p/6702896.html http://www.runoob.com/python3/python3-built-in-func ...