对象映射-Mapster

一、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在性能方面也很不错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值