对象映射-Mapster

news/2024/5/19 21:08:25 标签: c#, .netcore

目录

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


http://www.niftyadmin.cn/n/5295440.html

相关文章

HTML5+CSS3②——图像、超链接、音频、视频

目录 图像 超链接 音频 视频 图像 作用&#xff1a;在网页中插入图片 单标签&#xff1a; 标签名&#xff1a;<img src"图片的URL"> <img src"图片的URL" alt"替换文本" title"提示文本"> 属性写在尖括号里面&#xff0c;…

gitlab 11.11.8的备份与恢复及500错误的修复

gitlab已经集成了非常方便的备份和恢复命令&#xff0c;只要我们执行这些命令就能完成gitlab的备份与恢复了。 我想gitlab备份与恢复的目的无非就是将已经运行了很久的旧的gitlab服务&#xff0c;迁移到新的服务器上。如果你旧的gitlab上项目很少&#xff0c;就需要考虑迁移服…

分类模型评估方法

1.数据集划分 1.1 为什么要划分数据集? 思考&#xff1a;我们有以下场景&#xff1a; 将所有的数据都作为训练数据&#xff0c;训练出一个模型直接上线预测 每当得到一个新的数据&#xff0c;则计算新数据到训练数据的距离&#xff0c;预测得到新数据的类别 存在问题&…

云计算的服务模式和发展趋势

一、云计算的三种服务模式&#xff1a; 1、Iaas&#xff08;infrastructure as a service&#xff09;: 基础设施即服务&#xff08;基础的云主机、磁盘、系统等&#xff0c;云厂商都给配置好&#xff0c;需要自己搭建云平台&#xff0c;并在云平台上部署业务所需要的软件&…

安全生产知识竞赛活动方案

为进一步普及安全生产法律法规知识&#xff0c;增强安全意识&#xff0c;提高安全技能&#xff0c;经研究&#xff0c;决定举办以“加强安全法治、保障安全生产”为主题的新修订《安全生产法》知识竞赛活动&#xff0c;现将有关事项通知如下&#xff1a; 一、活动时间&#xf…

云计算基础、Issa、Pssa、Saas区别

一、了解云计算 云计算&#xff08;cloud computing&#xff09;是分布式计算的一种&#xff0c;指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序&#xff0c;然后&#xff0c;通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。云计算…

编程新手IDE

身为一个前端开发者&#xff0c;我深知一个好的开发环境对于编程体验的重要性。对于新手来说&#xff0c;选择一个合适的IDE&#xff08;集成开发环境&#xff09;更是至关重要。一个好的IDE可以提高编程效率&#xff0c;减少错误&#xff0c;让新手更专注于学习编程本身。 今…

新版 macos下安装python 2.7 python 3.x多版本简单方法 pyenv python多版本管理工具

在新版本的macos中已经将默认的python升级成了3.x , 今天介绍一个简单的方法在新版本的macos中快速安装 python 2.7的方法, 就是使用brew安装python版本管理工具 pyenv来安装python2.7 # 安装pyenv版本管理工具 brew install pyenv # 安装python2.7 可以安装多个版本的ptyhon…