• 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,应该会有帮助。

  • 相关阅读:
    刘备和诸葛亮闹翻:无意说出蜀国灭亡的根源?
    亚马逊为什么能吞噬世界?贝索斯有这么一种独特的战略思维
    现在的社会,能负债的人,一定是有本事的人
    富士康为何转向美国:人口红利消失 炒房带来恶性循环
    中国华为:硅谷风混搭国企作派
    亚马逊拟斥资15亿美元建航空货运中心
    比数字工具更好用的纸和笔
    张小龙的克制 小程序 微信
    阿里前CEO卫哲用自己10余年经历,倾诉B2B的三差、四率、两大坑
    关于自信的励志名言
  • 原文地址:https://www.cnblogs.com/buyixiaohan/p/7379734.html
Copyright © 2020-2023  润新知