详情

首页手游攻略 如何在 .NET 9 中使用 Mapster 快速、高效的实现方式对象映射实用指南

如何在 .NET 9 中使用 Mapster 快速、高效的实现方式对象映射实用指南

佚名 2026-09-02 20:30:02

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“如何在 .NET 9 中采用 Mapster 快速、高效的实现方法对象映……”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

目录
  • 前言
  • Mapster 介绍
  • 安装 Mapster 相关包
    • 方式一、NuGet 包管理器安装
    • 方式二、.NET CLI 安装
  • 在 Program.cs 中注册 Mapster 服务
    • 基础映射一行代码搞定
      • Student(源对象)
      • StudentViewModel(目标对象)
      • Mapster 自动完成映射
    • 自定义映射规则
      • UserInfo(源对象)
      • UserInfoViewModel(目标对象)
      • 设置 Mapster 映射规则
      • 自定义映射规则
    • 完整示例源代码

      前言

      从实现思路看,在日常开发里,我们常常需将一个对象映射到另一个对象,比如将数据库实体转换为数据传输对象(DTO),或将请求模型映射为领域模型。这个过程通常涉及大量重复性代码,如果每次都手动编写,不仅严重影响开发效率,而且随着项目规模不断增长,还容易出现错误(如:属性遗漏、手写时写错或复制粘贴失误等)。

      本文我们的主要内容就是讲解如何在 ASP.NET Core 9.0 Web API 项目中采用 Mapster 更快、高效的实现对象映射。

      Mapster 介绍

      Mapster 是一个开源免费(落到代码里,MIT license)、更快、高性能、灵活且易于采用的 .NET 对象映射库,用来在 .NET 用程序中进行对象之间的转换和映射操作,大幅减少手动赋值带来的重复代码、人为错误和维护成本。

      • 开源地址:(链接已移除)
      • 在线文档:(链接已移除)

      安装 Mapster 相关包

      方式一、NuGet 包管理器安装

      在 NuGet 包管理器中搜索:MapsterMapster.DependencyInjection 安装:

      Mapster 核心功能包

      Mapster.DependencyInjection 依赖注入集成包

      方式二、.NET CLI 安装

      dotnet add package Mapster --version 7.4.0 #核心功能包
      dotnet add package Mapster.DependencyInjection --version 1.0.1 #依赖注入集成包

      在 Program.cs 中注册 Mapster 服务

      var builder = WebApplication.CreateBuilder(args);
      // 注册 Mapster 服务
      builder.Services.AddMapster();
      // 注册 Mapster 映射规则
      MapsterConfig.Register();

      基础映射一行代码搞定

      下面我们分别定义一个源对象(Student)和一个目标对象(StudentViewModel),它们的属性名和类型完全一致。

      Student(源对象)

      public classStudent
          {
              /// <summary>
              /// 学生ID [主键,自动递增]
              /// </summary>
              [PrimaryKey, AutoIncrement]
              [Display(Name = "学生ID")]
              publicint StudentID { get; set; }
              /// <summary>
              /// 班级ID
              /// </summary>
              [Display(Name = "班级ID")]
              publicint ClassID { get; set; }
              /// <summary>
              /// 学生姓名
              /// </summary>
              [Display(Name = "学生姓名")]
              publicstring Name { get; set; }
              /// <summary>
              /// 学生年龄
              /// </summary>
              [Display(Name = "学生年龄")]
              publicint Age { get; set; }
              /// <summary>
              /// 学生性别
              /// </summary>
              [Display(Name = "学生性别")]
              publicstring Gender { get; set; }
          }

      StudentViewModel(目标对象)

      public classStudentViewModel
          {
              /// <summary>
              /// 学生ID
              /// </summary>
              [PrimaryKey, AutoIncrement]
              [Display(Name = "学生ID")]
              publicint StudentID { get; set; }
              /// <summary>
              /// 班级ID
              /// </summary>
              [Display(Name = "班级ID")]
              publicint ClassID { get; set; }
              /// <summary>
              /// 学生姓名
              /// </summary>
              [Display(Name = "学生姓名")]
              publicstring Name { get; set; }
              /// <summary>
              /// 学生年龄
              /// </summary>
              [Display(Name = "学生年龄")]
              publicint Age { get; set; }
              /// <summary>
              /// 学生性别
              /// </summary>
              [Display(Name = "学生性别")]
              publicstring Gender { get; set; }
              /// <summary>
              /// 班级名称
              /// </summary>
              [Display(Name = "班级名称")]
              publicstring ClassName { get; set; }
          }

      Mapster 自动完成映射

      只要属性名和类型一致,Mapster 自动完成映射,无需任何设置!

      private async Task<List<StudentViewModel>?> GetStudentClassInfo(List<Student> students)
              {
                  // Mapster 映射(无需任何配置!)
                  var studentsListDto = students.Adapt<List<StudentViewModel>>();
                  if (studentsListDto?.Count > 0)
                  {
                      var classIDs = studentsListDto.Select(x => x.ClassID).Distinct().ToList();
                      var querySchoolClassList = await _schoolClassHelper.QueryAsync(x => classIDs.Contains(x.ClassID)).ConfigureAwait(false);
                      if (querySchoolClassList?.Count > 0)
                      {
                          foreach (var studentItem in studentsListDto)
                          {
                              var getClassInfo = querySchoolClassList.FirstOrDefault(x => x.ClassID == studentItem.ClassID);
                              if (getClassInfo != null)
                              {
                                  studentItem.ClassName = getClassInfo.ClassName;
                              }
                          }
                      }
                  }
                  return studentsListDto;
              }

      映射结果输出:

      自定义映射规则

      属性名或类型不一致时,可借助设置指定映射逻辑。

      UserInfo(源对象)

      public classUserInfo
          {
              publicint Id { get; set; }
              publicstring FirstName { get; set; }
              publicstring LastName { get; set; }
              publicstring Email { get; set; }
              public DateTime CreatedAt { get; set; }
          }

      UserInfoViewModel(目标对象)

      public classUserInfoViewModel
          {
              publicint Id { get; set; }
              /// <summary>
              /// 合并 FirstName + LastName
              /// </summary>
              publicstring FullName { get; set; }
              publicstring Email { get; set; }
              /// <summary>
              /// 格式化日期
              /// </summary>
              publicstring CreatedDate { get; set; }
          }

      设置 Mapster 映射规则

      在项目根目录新建 MapsterConfig.cs

      /// <summary>
          /// Mapster 全局映射配置类。
          /// 用于集中注册项目中所有自定义的对象映射规则,
          /// 避免映射逻辑分散在各处,提升可维护性与可测试性。
          /// </summary>
          publicstaticclassMapsterConfig
          {
              /// <summary>
              /// 注册所有自定义的 Mapster 映射配置
              /// 此方法应在应用程序启动时(如 Program.cs)调用一次
              /// </summary>
              public static void Register()
              {
                  TypeAdapterConfig<UserInfo, UserInfoViewModel>
                      .NewConfig()
                      .Map(dest => dest.FullName,
                           src => $"{src.FirstName} {src.LastName}".Trim())
                      .Map(dest => dest.CreatedDate,
                           src => src.CreatedAt.ToString("yyyy-MM-dd"));
              }
          }

      自定义映射规则

      /// <summary>
          /// 使用 Mapster 映射 UserInfo 示例
          /// </summary>
          [ApiController]
          [Route("api/[controller]/[action]")]
          publicclassUserInfoController : ControllerBase
          {
              privatereadonly IMapper _mapper;
              /// <summary>
              /// 依赖注入
              /// </summary>
              /// <param name="mapper">mapper</param>
              public UserInfoController(IMapper mapper)
              {
                  _mapper = mapper;
              }
              /// <summary>
              /// GetUserInfo
              /// </summary>
              /// <returns></returns>
              [HttpGet]
              public List<UserInfoViewModel> GetUserInfos()
              {
                  var userInfos = new List<UserInfo>
                  {
                      new UserInfo
                      {
                          Id = 999,
                          FirstName = "李",
                          LastName = "四",
                          Email = "[email protected]",
                          CreatedAt = DateTime.Now.AddYears(-5)
                      },
                      new UserInfo
                      {
                          Id = 666,
                          FirstName = "张",
                          LastName = "三",
                          Email = "[email protected]",
                          CreatedAt = DateTime.UtcNow.AddDays(-10)
                      }
                  };
                  // 使用 Mapster 映射
                  var getUserInfoViewModels = _mapper.Map<List<UserInfoViewModel>>(userInfos);
                  return getUserInfoViewModels;
              }
          }

      映射结果输出:

      完整示例源代码

      • (链接已移除)

      到此这篇关于在 .NET 9 中采用 Mapster 更快、高效的实现对象映射的文章就介绍到这了,更多相关.net mapster 对象映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!

      您可能感兴趣的文章:

      • 如何在 .NET 9 中采用 Mapster 更快、高效的实现对象映射
      • ASP.NET Core Web中采用AutoMapper进行对象映射
      • .net中采用AutoMapper进行对象映射对象相互转换的操作方法
      • .NET中实现对象数据映射示例详解
      • .NET CORE中采用AutoMapper进行对象映射的方法

      相关资讯
      点击查看更多
      游戏推荐
      推荐专题
      热门阅读
      推荐下载