C#怎么使用AutoMapper C#对象属性映射配置方法

发布时间 - 2025-12-27 00:00:00    点击率:
AutoMapper是C#中用于DTO与实体间对象映射的主流库,需先定义Profile配置规则,再通过依赖注入获取IMapper执行Map操作;推荐在.NET 6+中用AddAutoMapper注册,配合AssertConfigurationIsValid验证配置

AutoMapper 是 C# 中最常用的对象映射库,用于简化不同类(尤其是 DTO 与实体)之间的属性赋值。核心思路是:先定义映射规则,再用 IMapper 实例执行映射。配置方式主要有两种——静态初始化(旧版兼容)和依赖注入方式(推荐,.NET Core / .NET 5+ 标准做法)。

使用依赖注入注册 AutoMapper(推荐)

Program.cs(.NET 6+)或 Startup.cs 中配置:

  • 安装 NuGet 包:AutoMapperAutoMapper.Extensions.Microsoft.DependencyInjection
  • 调用 AddAutoMapper() 自动扫描含 Profile 的程序集,或显式指定 Profile 类型
示例(.NET 6+ Program.cs):

builder.Services.AddAutoMapper(typeof(UserProfile)); // 扫描 UserProfile 类所在程序集

定义映射配置 Profile 类

继承 Profile,在构造函数中用 CreateMap() 声明规则:

  • 支持链式配置:如 .ForMember() 自定义字段映射、.Ignore() 忽略属性、.MapFrom() 指定源表达式
  • 支持条件映射:.Condition().PreCondition()
  • 支持扁平化映射(如 User.Address.Street → UserDto.Street),默认开启;也可禁用或手动配置
示例 Profile:

public class UserProfile : Profile
{
public UserProfile()
{
CreateMap()
.ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.FirstName + " " + src.LastName))
.ForMember(dest => dest.Age, opt => opt.MapFrom(src => DateTime.Now.Year - src.BirthDate.Year))
.ForMember(dest => dest.Email, opt => opt.Ignore());
}
}

在服务中注入并使用 IMapper

Controller 或 Service 构造函数中注入 IMapper,调用 Map(source)Map(source, destination)

  • Map(user):创建新对象并映射(最常用)
  • Map(user, userDto):将源数据填充到已有目标实例(适合编辑场景)
  • 支持集合映射:Map>(users)users.ProjectTo(mapper.ConfigurationProvider)(配合 EF 查询时延迟映射,避免全量加载)
Controller 示例:

private readonly IMapper _mapper;
public UsersController(IMapper mapper) => _mapper = mapper;

public IActionResult Get(int id)
{
var user = _context.Users.Find(id);
var dto = _mapper.Map(user); // 自动按 Profile 规则转换
return Ok(dto);
}

常见注意事项和技巧

避免踩坑,提升可维护性:

  • 映射前务必调用 AssertConfigurationIsValid()(开发环境)验证配置是否合法,比如类型不匹配、未映射的非空属性等
  • 不要在 Profile 中写业务逻辑,保持纯配置;复杂转换可封装为自定义 ValueResolver 或 IValueConverter
  • 若 DTO 和实体命名一致、类型兼容,AutoMapper 默认自动映射(约定优于配置),无需显式声明
  • 对于只读属性(如 get-only auto-property),需启用 AllowNullCollections = true 或配置 ForCtorParam 支持构造函数注入

基本上就这些。配置清晰、按需定制、结合 DI 使用,AutoMapper 就能既安全又高效地帮你处理对象转换。


# app  # ai  # microsoft  # 开发环境  # c#  # .net  # 封装  # 构造函数  # auto  # int  # 继承  # class  # public  # private  # Property  # var  # map  # 对象  # typeof  # 自定义  # 链式  # 最常用  # 尤其是  # 就能  # 已有  # 帮你  # 也可  # 再用  # 有两种 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高端建站如何打造兼具美学与转化的品牌官网?  如何在云主机上快速搭建网站?  如何在建站主机中优化服务器配置?  如何用AWS免费套餐快速搭建高效网站?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  JavaScript如何实现继承_有哪些常用方法  Android仿QQ列表左滑删除操作  独立制作一个网站多少钱,建立网站需要花多少钱?  javascript中的try catch异常捕获机制用法分析  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel中的withCount方法怎么高效统计关联模型数量  浅述节点的创建及常见功能的实现  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  开心动漫网站制作软件下载,十分开心动画为何停播?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  利用 Google AI 进行 YouTube 视频 SEO 描述优化  如何在新浪SAE免费搭建个人博客?  Android 常见的图片加载框架详细介绍  如何在阿里云虚拟服务器快速搭建网站?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  详解Android图表 MPAndroidChart折线图  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel如何处理表单验证?(Requests代码示例)  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  jQuery中的100个技巧汇总  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何在VPS电脑上快速搭建网站?  如何基于PHP生成高效IDC网络公司建站源码?  奇安信“盘古石”团队突破 iOS 26.1 提权  如何在IIS管理器中快速创建并配置网站?  高端建站三要素:定制模板、企业官网与响应式设计优化  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  微信小程序 配置文件详细介绍  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  js实现获取鼠标当前的位置  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel如何使用Sanctum进行API认证?(SPA实战)  Laravel如何实现多对多模型关联?(Eloquent教程)  Laravel怎么在Controller之外的地方验证数据  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】