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 包:
AutoMapper和AutoMapper.Extensions.Microsoft.DependencyInjection - 调用
AddAutoMapper()自动扫描含Profile的程序集,或显式指定 Profile 类型
builder.Services.AddAutoMapper(typeof(UserProfile)); // 扫描 UserProfile 类所在程序集
定义映射配置 Profile 类
继承 Profile,在构造函数中用 CreateMap 声明规则:
- 支持链式配置:如
.ForMember()自定义字段映射、.Ignore()忽略属性、.MapFrom()指定源表达式 - 支持条件映射:
.Condition()或.PreCondition() - 支持扁平化映射(如
User.Address.Street → UserDto.Street),默认开启;也可禁用或手动配置
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 或 Map(source, destination):
-
Map:创建新对象并映射(最常用)(user) -
Map(user, userDto):将源数据填充到已有目标实例(适合编辑场景) - 支持集合映射:
Map或- >(users)
users.ProjectTo(配合 EF 查询时延迟映射,避免全量加载)(mapper.ConfigurationProvider)
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 就能既安全又高效地帮你处理对象转换。










