如何使用AutoMapper 10版本实现两个对象合并为单个目标对象
AutoMapper 10 多源对象合并映射实现方案(.NET 5+ 依赖注入场景)
步骤1:安装依赖NuGet包
需在项目中安装对应版本的两个包:
AutoMapper(10.x 正式版)AutoMapper.Extensions.Microsoft.DependencyInjection(对应适配10.x的版本)
步骤2:新建映射配置Profile类
需新建类,示例命名为MappingProfile.cs,可放在项目根目录或专门的Config文件夹下
using AutoMapper; // 引入你自己的实体类所在命名空间 public class MappingProfile : Profile { public MappingProfile() { // 配置两个源对象到目标对象的映射规则 // 同名属性AutoMapper会自动匹配,无需手动配置 CreateMap<ApiPerson, MergedPersonModel>(); CreateMap<DbProgramPerson, MergedPersonModel>(); // 如果有属性名不一致的情况,手动指定映射规则即可,示例: // CreateMap<DbProgramPerson, MergedPersonModel>() // .ForMember(dest => dest.LicenseNumber, opt => opt.MapFrom(src => src.ProgramLicenseNo)); } } // 下面是你提到的三个实体类示例,你可以根据自己的业务调整字段 /// <summary> /// 从API获取的人员信息类 /// </summary> public class ApiPerson { public string Name { get; set; } public string Address { get; set; } // 其他API返回字段 } /// <summary> /// 从数据库查询的ProgramPerson类 /// </summary> public class DbProgramPerson { public int PersonId { get; set; } public string ProgramLicenseNo { get; set; } public DateTime LicenseIssueDate { get; set; } // 其他数据库字段 } /// <summary> /// 合并后的目标模型类 /// </summary> public class MergedPersonModel { public int PersonId { get; set; } public string Name { get; set; } public string Address { get; set; } public string LicenseNumber { get; set; } public DateTime LicenseIssueDate { get; set; } // 其他你需要的合并后字段 }
步骤3:注册AutoMapper服务
代码放在Startup.cs的ConfigureServices方法中(.NET 5环境);如果是.NET 6+环境,放在Program.cs的顶层语句中
// .NET 5 写法 services.AddAutoMapper(typeof(MappingProfile)); // .NET 6 写法(Program.cs中) builder.Services.AddAutoMapper(typeof(MappingProfile));
注册完成后AutoMapper会自动扫描MappingProfile里的所有配置,且IMapper接口已注入到服务容器中,可直接在业务代码中注入使用。
步骤4:业务代码中实现合并映射
代码放在你自己的业务服务类、Controller等需要执行合并逻辑的位置
using AutoMapper; public class PersonService { private readonly IMapper _mapper; // 构造函数注入IMapper public PersonService(IMapper mapper) { _mapper = mapper; } public MergedPersonModel GetMergedPerson(int personId) { // 1. 分别获取两个数据源的对象 ApiPerson apiPerson = GetPersonFromApi(personId); // 你自己的API调用逻辑 DbProgramPerson dbPerson = GetPersonFromDb(personId); // 你自己的数据库查询逻辑 // 2. 先将第一个源对象映射为目标对象实例 MergedPersonModel mergedModel = _mapper.Map<MergedPersonModel>(apiPerson); // 3. 再将第二个源对象映射到已存在的目标对象实例上,完成合并 _mapper.Map(dbPerson, mergedModel); // 合并完成,直接返回即可 return mergedModel; } // 以下是你自己的业务逻辑方法,此处仅做示例 private ApiPerson GetPersonFromApi(int personId) { // 调用第三方API获取人员信息的逻辑 return new ApiPerson(); } private DbProgramPerson GetPersonFromDb(int personId) { // 查询数据库获取ProgramPerson信息的逻辑 return new DbProgramPerson(); } }
补充说明
- 如果两个源对象存在同名字段,后执行映射的源会覆盖之前的字段值,你可以根据业务需要调整两个源的映射顺序
- 如果需要忽略某些字段不参与映射,可以在Profile的映射配置中添加
.ForMember(dest => dest.不需要映射的字段, opt => opt.Ignore())即可
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

