原来想应该介绍下背景说明下好处什么的,仔细想都是废话 ,直接上代码吧。

首先有两个类,一个是和数据库对应的实体 Student,一个是和页面展示相关的页面模型 StudentModel

  1. /// <summary>
  2. /// 学生表
  3. /// </summary>
  4. public class Student
  5. {
  6. [Key]
  7. public int Id { get; set; }
  8.  
  9. /// <summary>
  10. /// 学生姓名
  11. /// </summary>
  12. [StringLength(10)]
  13. [Required]
  14. public string Name { get; set; }
  15.  
  16. /// <summary>
  17. /// 生日
  18. /// </summary>
  19. public DateTime? Birthday { get; set; }
  20.  
  21. /// <summary>
  22. /// 性别
  23. /// </summary>
  24. public Gender Genderx { get; set; }
  25. /// <summary>
  26. /// 毕业院校
  27. /// </summary>
  28. public string Graduated { get; set; }
  29. /// <summary>
  30. /// 所学专业
  31. /// </summary>
  32. public string Professional { get; set; }
  33.  
  34. /// <summary>
  35. /// 爱好
  36. /// </summary>
  37. public string Hobby { get; set; }
  38.  
  39. /// <summary>
  40. /// 头像
  41. /// </summary>
  42. public string Avatar { get; set; }
  43.  
  44. /// <summary>
  45. /// 账号
  46. /// </summary>
  47. public string Account { get; set; }
  48. /// <summary>
  49. /// 密码
  50. /// </summary>
  51. public string Password { get; set; }
  52.  
  53. }
  1. public class StudentModel
  2. {
  3. [Key]
  4. public int Id { get; set; }
  5.  
  6. [StringLength(4, ErrorMessage = "名字长度不能超过四个字")]
  7. [Required(ErrorMessage = "用户姓名不能为空")]
  8. [Display(Name = "学生姓名")]
  9. public string Name { get; set; }
  10.  
  11. [Display(Name = "生日")]
  12. public DateTime Birthday { get; set; }
  13. [Display(Name = "生日")]
  14. public string ShowBirthday { get; set; }
  15. public Gender Genderx { get; set; }
  16. [Display(Name = "性别")]
  17. public string ShowGender { get; set; }
  18.  
  19. [Display(Name = "头像")]
  20. public string Avatar { get; set; }
  21. [Display(Name = "毕业院校")]
  22. public string Graduated { get; set; }
  23. [Display(Name = "主修专业")]
  24. public string Professional { get; set; }
  25.  
  26. [Display(Name = "爱好")]
  27. public string Hobby { get; set; }
  28. [Display(Name = "账号")]
  29. public string Account { get; set; }
  30.  
  31. [Display(Name = "密码")]
  32. [DataType(DataType.Password)]
  33. public string Password { get; set; }
  34.  
  35. }

请不要关注为什么有这些字段和为什么设置这些字段,这些都是剧情需要。

为了将Student 转换成StudentModel,最初,我们需要写一个方法,通过循环的方式来做,如下:

  1. //获取学生数据
  2. var entities = db.Students.ToList();
  3. var models = new List<StudentModel>();
  4. foreach (var item in entities)
  5. {
  6. var model = new StudentModel();
  7. model.Id = item.Id;
  8. model.Birthday = item.Birthday.Value;
  9. model.ShowBirthday = item.Birthday.Value.ToString("yyyy-MM-dd");
  10. model.Genderx = item.Genderx;
  11. model.Graduated = item.Graduated;
  12. model.Professional = item.Professional;
  13. model.Hobby = item.Hobby;
  14. model.Avatar = item.Avatar;
  15. model.Account = item.Account;
  16. model.Password = item.Password;
  17.  
  18. models.Add(model);
  19. }

后来呢,我们有了LINQ,我们的代码进化了一下,如下:

  1. //获取学生数据
  2. var entities = db.Students.ToList();
  3.  
  4. var models = entities.Select(s => new StudentModel()
  5. {
  6. Id = s.Id,
  7. Birthday = s.Birthday.Value,
  8. ShowBirthday = s.Birthday.Value.ToString("yyyy-MM-dd"),
  9. Genderx = s.Genderx,
  10. Graduated = s.Graduated,
  11. Professional = s.Professional,
  12. Hobby = s.Hobby,
  13. Avatar = s.Avatar,
  14. Account = s.Account,
  15. Password = s.Password
  16. });

一般的转换无外乎这两种,再有就是一些大神,通过反射等技术自己写了一些helper,我等菜鸟自然没有这等功力来做,只能找现成的用了,这时候AutoMapper就登场了。

What is AutoMapper?

AutoMapper is an object-object mapper. Object-object mapping works by transforming an input object of one type into an output object of a different type. What makes AutoMapper interesting is that it provides some interesting conventions to take the dirty work out of figuring out how to map type A to type B. As long as type B follows AutoMapper's established convention, almost zero configuration is needed to map two types.

上文来自AutoMapper官方Wiki,同样的不要太关心。因为作者设定你已经知道AutoMapper是干嘛的了。如果不知道,回头看看上面的代码,领悟一下。

进入正题,如何使用AutoMapper简化我们的代码:

  1. 首先,要在项目中引入AutoMapper这个东东,如果VS中有Nuget这个工具,直接使用Nuget安装一下AutoMapper这个package,如果没有,那去官网下载一个DLL自行Copy过来吧。

  2. 一般AutoMapper使用分两步
    • 注册对象映射关系,告诉AutoMapper对象A和对象B可以相互转换,并且转换规则是怎么样的,默认同名的属性不用特殊说明,自己会转换过去

    • 使用Map方法,把对象A转换成对象B

根据官网介绍,有三种方式来使用AutoMapper,或者说三种配置的方式来完成。

前两种呢,就是在哪里使用就在哪里配置,每次用每次配置。第三种把配置的工作放在程序启动时处理,后面直接使用,无需每次配置。

一般开发中才使用第三种方案,前两个方案适合做代码演示或者临时使用。

  • 第一种

    1. //@1 第一种快捷使用方式
    2. Mapper.Initialize(cfg => cfg.CreateMap<Student, StudentModel>());
    3. var models = Mapper.Map<List<Student>, List<StudentModel>>(entities);
  • 第二种
    1. //@2 第二种快捷使用方式
    2. var config = new MapperConfiguration(cfg => cfg.CreateMap<Student, StudentModel>());
    3. var mapper = config.CreateMapper();
    4. var models= mapper.Map<List<Student>, List<StudentModel>>(entities);
  • 第三种,稍微复杂一点, 需要添加一个文件,并且修改Application_Start()方法,添加如下类文件:
    1. /// <summary>
    2. /// automapper配置文件
    3. /// </summary>
    4. public class OrganizationProfile : Profile
    5. {
    6. public OrganizationProfile()
    7. {
    8. CreateMap<Student, StudentModel>()
    9. .ForMember(dest => dest.ShowBirthday,
    10. opt =>
    11. {
    12. opt.MapFrom(src => src.Birthday.Value.ToString("yyyy-MM-dd"));
    13. })
    14. .ForMember(dest => dest.ShowGender,
    15. opt =>
    16. {
    17. opt.MapFrom(src => src.Genderx == Domain.Common.Gender.Male ? "男" : "女");
    18. }).ReverseMap();
    19. }
    20. }

    然后修改Application_Start()方法,如下:

    1. //配置AutoMapper映射属性,在项目启动时生效
    2. Mapper.Initialize(cfg =>
    3. {
    4. cfg.AddProfile<OrganizationProfile>();
    5. });

    最后是调用Map()进行映射,如下:

    1. var models = mapper.Map<List<Student>, List<StudentModel>>(entities);

OK,本文完结,以上是对AutoMapper的简单实用,适合用来体会AutoMapper的效果和演示其使用的入门Demo,实际使用中会涉及更多的映射配置,配合系统架构进行依赖注入等等,其实官网都有比较详细的介绍了,可以官网上找找,实在不行看下官网上的Example,应该会有帮助。

AutoMapper之如何开始,适合入门和演示的更多相关文章

  1. 适合入门自学服装裁剪滴书(更新ing)

    [♣]适合入门自学服装裁剪滴书(更新ing) [♣]适合入门自学服装裁剪滴书(更新ing) 适合入门自学服装裁剪滴书(更新ing) 来自: 裁缝阿普(不为良匠,便为良医.) 2014-04-06 23 ...

  2. Easyui + asp.net mvc + sqlite 开发教程(录屏)适合入门

    Easyui + asp.net mvc + sqlite 开发教程(录屏)适合入门 第一节: 前言(技术简介) EasyUI 是一套 js的前端框架 利用它可以快速的开发出好看的 前端系统 web ...

  3. 最适合入门的Laravel中级教程(一)

    Laravel 是一个全栈框架: 我们使用 Laravel 开发业务常见有 3 个方向: 前端页面和后端逻辑混合的应用 主要是面向对 SEO 有需求的项目: 比如说新闻资讯博客文章等: 一般在控制器中 ...

  4. Laravel初级教程浅显易懂适合入门

    整理了一些Laravel初级教程,浅显易懂,特适合入门,留给刚学习laravel想快速上手有需要的朋友 最适合入门的laravel初级教程(一)序言 最适合入门的laravel初级教程(二)安装使用 ...

  5. pc/移动端(手机端)浏览器的直播rtmp hls(适合入门者快速上手)

    一.直播概述 关于直播,大概的过程是:推流端——>源站——>客户端拉流,用媒介播放 客户端所谓的拉流就是一个播放的地址url,会有多种类型的流: 视频直播服务目前支持三种直播协议,分别是R ...

  6. JavaScript: JavaScript的简介和入门代码演示

    1.Javascript的发展历史介绍: javascript是指的实在网页上编写的编程语言,其主要是控制器html的动态显示效果.HTMl能带来的只是一些基本的页面的风格,而要展示的漂亮使用CSS, ...

  7. 【转】javascript入门系列演示·三种弹出对话框的用法实例

    对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3: 一个带输入的对话框,可以返回用户填入的 ...

  8. javascript入门系列演示·三种弹出对话框的用法实例

    对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3: 一个带输入的对话框,可以返回用户填入的 ...

  9. 01--Java语言概述与开发环境 最适合入门的Java教程

    Java 程序运行机制 编译型语言: 使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性"翻 译"成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该 ...

随机推荐

  1. 3_bootsrap布局容器

    3.布局容器 BootStrap必须需要至少一个布局容器,才能为页面内容进行封装和方便的样式控制. 相当于一个画板. 帮助手册位置:全局CSS样式------->概览------->布局容 ...

  2. Maven(四-1) Maven的配置文件settings.xml

    转载于:http://www.cnblogs.com/yakov/archive/2011/11/26/maven2_settings.html 概览 当Maven运行过程中的各种配置,例如pom.x ...

  3. 【转】dijkstra算法

    来自:https://blog.csdn.net/tw_345/article/details/50109375#comments 2015年11月30日 10:55:08 阅读数:1241 说到di ...

  4. Notepad++中的高级查找

      准备以下字符串用来演示 abcdeab cdeabcde abcd eabcde   基于扩展的查找 基于扩展的查找不能算是真正的正则表达式搜索,因此这种查找方式仅是提供了支持转义字符.主要常用的 ...

  5. 实现HBase增量入库(HBase删除自定义时间戳行数据)

    目录 1. 背景描述 2. 问题描述 3. 解决方案 1. 背景描述 目前在做音乐推荐项目,前期做排序模型优化,任务是使用模型对用户的历史音乐进行排序,有6800多万个用户,约40G的用户数据,使用H ...

  6. linux install jupyter notebook

    install sudo pip install jupyter notebook start sudo jupyter notebook 一般,文件目录默认在你启动的位置.你可以在notebook里 ...

  7. chrome url protocol 提示配置文件路径

    %localappdata%\Google\Chrome\User Data\Default\Preferences 搜索对应的协议名,例如:{"x-github-client": ...

  8. [在职软件工程]基于CMMI的软件工程教程

    第1章 软件工程基础 1.1软件工程基本原理 a.按照软件生命周期的阶段划分制定计划,严格依据计划进行管理 项目概要计划,里程碑计划,项目控制计划,产品控制计划,验证计划,运行维护计划 b.坚持进行阶 ...

  9. IntelliJ IDEA建立source同级的文件夹

    1.项目中一般都是将配置文档放入到config的source文件夹下,但是IDE没有直接建立source文件夹的方式,所以我们只做文件夹需要如下操作: 选中项目--->右键,选择new ---& ...

  10. Redis安装系统服务1073错误

    报错:D:\ProgramFiles\redis>redis-server.exe --service-install redis.windows.conf --loglevel verbose ...