AutoMapper之如何开始,适合入门和演示

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

 

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

/// <summary>
    /// 学生表
    /// </summary>
    public class Student
    {
        [Key]
        public int Id { get; set; }

        /// <summary>
        /// 学生姓名
        /// </summary>
        [StringLength(10)]
        [Required]
        public string Name { get; set; }

        /// <summary>
        /// 生日
        /// </summary>
        public DateTime? Birthday { get; set; }

        /// <summary>
        /// 性别
        /// </summary>
        public Gender Genderx { get; set; }
        /// <summary>
        /// 毕业院校
        /// </summary>
        public string Graduated { get; set; }
        /// <summary>
        /// 所学专业
        /// </summary>
        public string Professional { get; set; }

        /// <summary>
        /// 爱好
        /// </summary>
        public string Hobby { get; set; }

        /// <summary>
        /// 头像
        /// </summary>
        public string Avatar { get; set; }

        /// <summary>
        /// 账号
        /// </summary>
        public string Account { get; set; }
        /// <summary>
        /// 密码
        /// </summary>
        public string Password { get; set; }


    }
public class StudentModel
    {
        [Key]
        public int Id { get; set; }

        [StringLength(4, ErrorMessage = "名字长度不能超过四个字")]
        [Required(ErrorMessage = "用户姓名不能为空")]
        [Display(Name = "学生姓名")]
        public string Name { get; set; }

        [Display(Name = "生日")]
        public DateTime Birthday { get; set; }
        [Display(Name = "生日")]
        public string ShowBirthday { get; set; }
        public Gender Genderx { get; set; }
        [Display(Name = "性别")]
        public string ShowGender { get; set; }

        [Display(Name = "头像")]
        public string Avatar { get; set; }
        [Display(Name = "毕业院校")]
        public string Graduated { get; set; }
        [Display(Name = "主修专业")]
        public string Professional { get; set; }

        [Display(Name = "爱好")]
        public string Hobby { get; set; }
        [Display(Name = "账号")]
        public string Account { get; set; }

        [Display(Name = "密码")]
        [DataType(DataType.Password)]
        public string Password { get; set; }

    }

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

 

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

//获取学生数据
            var entities = db.Students.ToList();
            var models = new List<StudentModel>();
            foreach (var item in entities)
            {
                var model = new StudentModel();
                model.Id = item.Id;
                model.Birthday = item.Birthday.Value;
                model.ShowBirthday = item.Birthday.Value.ToString("yyyy-MM-dd");
                model.Genderx = item.Genderx;
                model.Graduated = item.Graduated;
                model.Professional = item.Professional;
                model.Hobby = item.Hobby;
                model.Avatar = item.Avatar;
                model.Account = item.Account;
                model.Password = item.Password;

                models.Add(model);
            }

 

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

//获取学生数据
            var entities = db.Students.ToList();

            var models = entities.Select(s => new StudentModel()
            {
                Id = s.Id,
                Birthday = s.Birthday.Value,
                ShowBirthday = s.Birthday.Value.ToString("yyyy-MM-dd"),
                Genderx = s.Genderx,
                Graduated = s.Graduated,
                Professional = s.Professional,
                Hobby = s.Hobby,
                Avatar = s.Avatar,
                Account = s.Account,
                Password = s.Password
            });

一般的转换无外乎这两种,再有就是一些大神,通过反射等技术自己写了一些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 第一种快捷使用方式
                Mapper.Initialize(cfg => cfg.CreateMap<Student, StudentModel>());
                var models = Mapper.Map<List<Student>, List<StudentModel>>(entities);
  • 第二种
    //@2 第二种快捷使用方式
                var config = new MapperConfiguration(cfg => cfg.CreateMap<Student, StudentModel>());
                var mapper = config.CreateMapper();
                var models= mapper.Map<List<Student>, List<StudentModel>>(entities);
  • 第三种,稍微复杂一点, 需要添加一个文件,并且修改Application_Start()方法,添加如下类文件:
    /// <summary>
        /// automapper配置文件
        /// </summary>
        public class OrganizationProfile : Profile
        {
            public OrganizationProfile()
            {
                CreateMap<Student, StudentModel>()
                    .ForMember(dest => dest.ShowBirthday,
                    opt =>
                    {
                        opt.MapFrom(src => src.Birthday.Value.ToString("yyyy-MM-dd"));
                    })
                    .ForMember(dest => dest.ShowGender,
                    opt =>
                    {
                        opt.MapFrom(src => src.Genderx == Domain.Common.Gender.Male ? "" : "");
                    }).ReverseMap();
            }
        }

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

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

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

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

     

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

posted @ 2017-08-17 08:44  天北涯  阅读(269)  评论(0编辑  收藏  举报