autoMapper 基于约定的对象映射器
目录
- 安装包
- 添加服务
- 书写映射关系
安装包
需要安装两个包:AutoMapper
和AutoMapper.Extensions.Microsoft.DependencyInjection
第二个是第一个的扩展包
添加服务
在 ConfigureServices 方法中添加:services.AddAutoMapper(typeof(mapperSet));
需要注意的是 mapperSet 类为存放映射规则类。
书写映射关系
一切准备工作都非常简单,接下来就需要根据个人的需要定义不同的映射规则。
public class mapperSet : Profile
{
public mapperSet()
{
}
}
注意点:1 继承于 Profile 类。 2 在构造函数中书写规则
源类与目标类
源类:
public class Person
{
public int Id { get; set; }
public string Name { get; set;}
public string Email { get; set }
public int Age { get; set; }
}
目标类:
public class personDto
{
public int Id { get; set; }
public string Name { get; set;}
public string Email { get; set }
public int Age { get; set; }
}
简单映射
简单映射:源类的属性名与目标类的属性名一致,只是做简单的赋值,现在我们准备的两个类就具备简单映射的条件
public mapperSet()
{
CreateMap<Person, personDto>();
}
注意:在构造函数中定义规则。
实验代码与结果:
Person person = new Per() {
Id = 1,
Name = "zz",
Age = 18,
Email"1234567@qq.com"
};
personDto dto = npersonDto(
mapper.Map<PersopersonDto>(person,dto);
这个很简单,不过记得把 mapper 注入进来,类型为IMapper mapper
数组映射
当我们需要对数组或者列表进行映射的时候,我们只需添加类的映射关系即可,比如我们要对上面的两个类进行映射,那么我们现在不需要添加新的关系。
List<Person> people =
new List<Person>() {
new Person() {
Id = 1,
Name = "zz",
Age = 18,
Email = "123456@qq.com"
},
new Person() {
Id = 2,
Name = "wbz",
Age = 19,
Email = "456789@qq.com"
}
};
List<personDto> dtos = newList<personDto>();
mapper.Map<List<Person>,List<personDto>>(peopledtos);
条件映射与映射到指定属性
在某些情况下我们需要根据某些条件来判断某个属性是否符合规则。比如当年龄小于 0 的时候我们不赋值。另外当源类型的属性名与目标类型的属性名不一致的时候我们需要指定映射属性。我们将 personDto 的 Age 改为 dtoAge。
CreateMap<Person, personDto>().ForMember(dest => dest.dtoAge,
opt => {
//指定映射关系
opt.MapFrom(src => src.Age);
//判断是否符合条件
opt.Condition(src => src.Age >= 0);
});
这里因为 Age 小于 0 所以没有赋值(int 默认值为 0,所以 dtoAge 为 0)
其他
autoMapper 自带展平功能(源类中没有和目标类匹配的属性名时,自动匹配源类的包含类)。
数组空替换,一般用于数组列表转换,当数组为 null 时自动映射为[],启用方法:在映射规则中添加AllowNullCollections = true;
属性空替换,当属性为空时替换为指定值,这个我忘记怎么用了。。一般为空关键属性都过不了 FluentValidation,有兴趣的可以自己去看看。
泛型映射,不太常用,基本上大同小异,有需要的可以去看一下文档。
总结
比较好用的东西,当然还有很多功能时很强大的。