目录
一、Mapster是什么?
二、简单使用
1.对象映射
2.集合映射
三、Mapster配置
1.全局配置
2.实例化配置
3.通过IRegister实现接口
4.通过依赖注入
总结
一、Mapster是什么?
Mapster是一个快,小巧,功能强大的对象映射.Net框架
二、简单使用
安装NuGet包:Mapster
1.对象映射
创建两个实体类
对象的映射 User 转 UserDto
代码如下(示例):
public record User {
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public record UserDto
{
public string Name { get; set; }
public int Age { get; set; }
}
调用
代码如下(示例):
User user=new User (){ Id = 1, Name = "小明",Age=18 };
var dto=user.Adapt<UserDto>();
2.集合映射
List<User>转 List<UserDto>
代码如下(示例):
List<User> list=new List<User>() {
new User(){Id = 1, Name = "小明",Age=18},
new User(){Id = 2, Name = "小花",Age=18},
};
以前的用法 Select
var listdto=list.Select(x => new UserDto(){Name=x.Name, Age=x.Age}).ToList();
使用Adapt
var listdto= list.Adapt<List<UserDto>>();
默认情况下,无需任何配置,Mapster会根据两个实体字段名称相同进行匹配
第一次调用时,配置会被缓存,第二次将会从缓存中取,以此提升性能
三、Mapster配置
代码如下(示例):
public record User {
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public record UserDto
{
public string UserName { get; set; }
public int UserAge { get; set; }
}
此时Name 和UserName 、Age和UserAge 字段不一样,默认是无法直接映射的,需要设置映射规则
1.全局配置
代码如下(示例):
TypeAdapterConfig.GlobalSettings.ForType<User, UserDto>()
.Map(desc => desc.UserAge, source => source.Age)//指定属性映射规则
.Map(desc => desc.UserName, source => source.Name)
.Ignore(dest => dest.UserAge)//排除Age属性映射
.IgnoreIf((src, desc) => src.Age == 18, desc => desc.UserAge)//如果年龄等于18岁就排除Age属性映射
.IgnoreIf((src, desc) => src.Age == 18, "Name", "Age")//如果年龄等于18岁就排除Name、Age属性映射
.IgnoreNullValues(true)//如果是属性是空值就排除属性映射
.IgnoreAttribute(typeof(ExcludeAttribute))//排除标记了ExcludeAttribute的属性映射
.IgnoreNonMapped(true)//只映射Map指定的属性,其他属性都排除
.NameMatchingStrategy(NameMatchingStrategy.IgnoreCase);//忽略字段名称的大小写
User user = new User() { Id = 1, Name = "小明",Age=18 };
var dto = user.Adapt<UserDto>();
我们尽量不要把实体间的映射规则配置到 TypeAdapterConfig.GlobalSettings (默认配置)。随着业务的发展,一个配置很难兼顾所有业务,可能会出现冲突的情况,相对复杂的业务,可以新建一个TypeAdapterConfig,或者使用 config.Clone()能轻松复制一份配置。全局配置可以放一些简单的配置项,例如:映射时忽略大小写。
2.实例化配置
代码如下(示例):
var config = new TypeAdapterConfig();
//映射规则
config.ForType<User,UserDto>()
.Map(dest => dest.UserName, src => src.Name)
.Map(dest => dest.UserAge, src => src.Age);
var mapper = new Mapper(config);//务必将mapper设为单实例
var user = new User(){ Id = 1, Name = "小明",Age=18 };
var dto = mapper.Map<UserDto>(user);
3.通过IRegister实现接口
代码如下(示例):
//实现接口 IRegister
public class UserDtoRegister : IRegister
{
public void Register(TypeAdapterConfig config)
{
config.ForType<User, UserDto>()
.Map(dest => dest.UserName, src => src.Name)
.Map(dest => dest.UserAge, src => src.Age);
}
}
//实例化Mapper
var config = new TypeAdapterConfig();
config.Scan(Assembly.GetExecutingAssembly());
var mapper = new Mapper(config);//务必设置为单实例
var user = new User(){ Id = 1, Name = "小明",Age=18 };
var dto = mapper.Map<UserDto>(user);
4.通过依赖注入
安装NuGet包: Mapster.DependencyInjection
在Program 添加TypeAdapter、ServiceMapper服务
代码如下(示例):
var config = new TypeAdapterConfig();
// Or
// var config = TypeAdapterConfig.GlobalSettings;
builder.Services.AddSingleton(config);
builder.Services.AddScoped<IMapper, ServiceMapper>();
创建UserService服务类,注入IMapper
public class UserService
{
private readonly IMapper _mapper;
public UserService(IMapper mapper)
{
_mapper = mapper;
}
public void DoSomething(User poco)
{
var dto = _mapper.Map<UserDto>(poco);
}
}
总结
在我们组装数据时使用Mapster很方便对model对象的转化 而且Mapster在性能方面也很不错