AutoMapper

AutoMapper自动映射规范
两个类之间自动映射时,这两个类的属性名称和类型必须相同
public class Student()
{
    public long StudentId{get;set;}
    public string StudentName{get;set;}
}
public class StudentDto()
{
    public long StudentId{get;set;}
    public string StudentName{get;set;}
}

如果一个类中存在包含关系,另一个类要自动映射两个类时,映射类属性命名要在被包含类属性名的基础上加上被包含类的类名

public class Student()
{
    public long StudentId{get;set;}
    public string StudentName{get;set;}
    public Class class{get;set;} 
}
public class Class()
{
    public long Id{get;set;}
    public string Name{get;set;}
}
public class StudentDto()
{
    public long StudentId{get;set;}
    public string StudentName{get;set;}
    public long ClassId{get;set;}
    public string ClassName{get;set;}
}

 

注册一个映射关系

Mapper.Initialize(d=>d.CreateMap<源类型,目标类型>());
 
反向映射
创建之后更改目标类型,会反过来映射到源类型
ReverseMap方法
Mapper.Initalize(d=>d.CreateMap<源类型,目标类型>().ReverseMap());
var dto = Mapper.Map<StudentDto>(models);
dto.StudentName = "张三";//把目标类型值改变
Mapper.Map(dto,models);//反向映射

 

配置验证
automapper默认是检查所有属性是否可以映射
AssertConfigurationlsValid方法用来验证是否可以全部映射,如果不能则会报错
Mapper.Configuration.AssertConfigurationlsValid();

 

当我们的属性不能全部映射,但又不想报错时,可以使用Ignore方法来忽略掉 无法映射 or 不需要映射 的属性

Mapper.Initalize(d=>d.CreateMap<源类型,目标类型>().forMember(d=>d.Name,s=>s.Ignore())); //忽略Name属性

我们也可以在createmap时指定要验证的成员列表

Mapper.Initalize(d=>d.CreateMap<源类型,目标类型>(MemberList.StudentDTO));//只验证StudentDTO类的属性
//如果两个类都不需要检查,加上MemberList.None即可

 

automapper配置了两个类型的映射后,这两个类型的集合或数组都可以直接映射,无需再次配置

Mapper.Initalize(d=>d.CreateMap<源类型,目标类型>()); 
var dto = Mapper.Map<List<目标类型>>(List<源类型>);

 

automapper还可以映射子类,但是需要配置

Mapper.Initalize(d=>{
    d.CreateMap<源类型,目标类型>().Include<源子类型,目标子类型>();
    d.CreateMap<源子类型,目标子类型>();
});

源类型 model = new []{
    new 源类型();
    new 源子类型();
}
目标类型 DTO = Mapper.Map<目标类型[]>(model);
//源类型会被映射为目标类型
//源子类型会被映射为目标子类型

第一行是配置子类和父类的关系,第二行是配置子类之间的映射

posted @ 2018-04-19 21:20  生命不息bug不止  阅读(901)  评论(0编辑  收藏  举报