在AutoMapper未出世前,对象与对象之间的映射,我们只能通过手动为每个属性一一赋值,时间长了不仅是我们而且老外也觉得映射代码很无聊啊。这个时候老外的所写的强大映射库AutoMapper横空出世,AutoMapper是一个对象映射库, 它提供简单的类型配置,以及简单的映射测试。对象映射通过将一种类型的输入对象转换为不同类型的输出对象而起作用。项目之前有用过,但是对其了解不够透彻映射时有时候会抛异常,后来弃之,本节我们来详细了解下AutoMapper映射库。
AutoMapper基础版在AutoMapper中创建映射配置有两种方式。一种是通过实例化MapperConfiguration类来配置,一种是通过类Mapper中的静态方法Initialize来配置,下面我们来看看。
public class User { public int Id { get; set; } public int Age { get; set; } public string Name { get; set; } } public class UserDTO { public int Id { get; set; } public int Age { get; set; } public string Name { get; set; } }
static void Main(string[] args) { var user = new User() { Id = 1, Age = 10, Name = }; var config = new MapperConfiguration(cfg => cfg.CreateMap<User, UserDTO>()); mapper = config.CreateMapper(); //或者var mapper = new Mapper(config); userDTO = mapper.Map<User, UserDTO>(user); Console.ReadKey(); }
在Map映射方法中有两个参数,我们通俗讲则是从一个映射到另一个对象,在AutoMapper中将其称为映射源和映射目标。
关于本节映射都通过如下静态方法来实现,简单粗暴。
Mapper.Initialize(cfg => cfg.CreateMap<User, UserDTO>()); var userDTO = Mapper.Map<User, UserDTO>(user);
接下来我们再来看若映射源为空,那么是否会进行映射,还是抛异常呢?
static void Main(string[] args) { User user = null; Mapper.Initialize(cfg => cfg.CreateMap<User, UserDTO>()); var userDTO = Mapper.Map<User, UserDTO>(user); Console.ReadKey(); }
到此我们总结出一点:AutoMapper将映射源映射到目标时,AutoMapper将忽略空引用异常。 这是AutoMapper默认设计。
是不是到此关于AutoMapper就讲完了呢?童鞋想想所有场景嘛,这个只是最简单的场景,或者天马行空想想其他问题看看AutoMapper支持不,比如我想想,AutoMapper对属性大小写是否敏感呢?想完就开干啊。我们将User对象属性全部改为小写:
public class User { public int id { get; set; } public int age { get; set; } public string name { get; set; } }
static void Main(string[] args) { var user = new User() { id = 1, age = 10, name = }; Mapper.Initialize(cfg => cfg.CreateMap<User, UserDTO>()); var userDTO = Mapper.Map<User, UserDTO>(user); Console.ReadKey(); }
到这里我们又可以总结出一点:AutoMapper从映射源到映射目标时不区分大小写。
AutoMapper中级版我们讲完基础版,接下来来进入中级版看看AutoMapper到底有多强,磕不屎你哟。是否支持继承映射哎。
public class Base { public int Id { get; set; } public DateTime CreatedTime { get; set; } public DateTime ModifiedTime { get; set; } } public class User : Base { public int Age { get; set; } public string Name { get; set; } }
public class UserDTO { public int Id { get; set; } public DateTime CreatedTime { get; set; } public DateTime ModifiedTime { get; set; } public int Age { get; set; } public string Name { get; set; } }