如何使用AutoMapper映射单层对象到属性不匹配的嵌套结构
AutoMapper映射配置方案
1. 前置准备
首先安装所需NuGet包:
- 核心基础包:
AutoMapper - 若为ASP.NET Core项目,可额外安装依赖注入扩展包:
AutoMapper.Extensions.Microsoft.DependencyInjection
2. 核心映射配置
推荐通过AutoMapper的Profile类统一管理映射规则,由于源和目标的Employee类同名,建议通过命名空间区分两类避免冲突,配置示例如下:
using AutoMapper; // 引入源实体所在命名空间 using Source = YourSourceNamespace; // 引入目标实体所在命名空间 using Target = YourTargetNamespace; public class CustomMappingProfile : Profile { public CustomMappingProfile() { CreateMap<Source.Employee, Target.Employee>() // 映射姓名字段,AutoMapper默认忽略属性名大小写,此处显式配置更易维护 .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.name)) // 手动映射嵌套Location对象 .ForMember(dest => dest.Location, opt => opt.MapFrom(src => new Target.Location { City = src.city_name, State = src.State_name })); } }
3. 初始化与使用
非依赖注入场景(如控制台应用)
// 加载映射配置 var mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile<CustomMappingProfile>(); }); // 验证配置正确性,开发阶段建议开启,可提前发现映射遗漏 mapperConfig.AssertConfigurationIsValid(); // 创建Mapper实例 var mapper = mapperConfig.CreateMapper(); // 测试映射 var sourceEmployee = new Source.Employee { name = "张三", city_name = "杭州", State_name = "浙江" }; var targetEmployee = mapper.Map<Target.Employee>(sourceEmployee);
ASP.NET Core依赖注入场景
在Program.cs中注册AutoMapper即可:
var builder = WebApplication.CreateBuilder(args); // 注册AutoMapper,自动扫描所有Profile类 builder.Services.AddAutoMapper(typeof(CustomMappingProfile)); // 其他服务注册... var app = builder.Build(); // 中间件配置... app.Run();
后续使用时直接在构造函数注入IMapper接口调用即可。
4. 可选优化:复用Location映射规则
如果存在多个场景需要从源Employee映射到Location类型,可以单独抽离Location的映射规则,提高代码复用性:
public class CustomMappingProfile : Profile { public CustomMappingProfile() { // 单独配置Employee到Location的映射 CreateMap<Source.Employee, Target.Location>() .ForMember(dest => dest.City, opt => opt.MapFrom(src => src.city_name)) .ForMember(dest => dest.State, opt => opt.MapFrom(src => src.State_name)); // Employee之间的映射可简化为 CreateMap<Source.Employee, Target.Employee>() .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.name)) .ForMember(dest => dest.Location, opt => opt.MapFrom(src => src)); } }
内容的提问来源于stack exchange,提问作者user5979
相关产品推荐
相关产品推荐

