如何使用AutoMapper将源字段映射到嵌套对象属性?
如何用AutoMapper将GameResponseModel的阵容映射到Team的Roster属性?
场景说明
在.NET 7项目中使用AutoMapper.Extensions.Microsoft.DependencyInjection(12.0.0),API返回的比赛信息反序列化为GameResponseModel:
public class GameResponseModel { public int Id { get; set; } public DateTime Start { get; set; } public TeamResponseModel HomeTeam { get; set; } public TeamResponseModel AwayTeam { get; set; } public List<PlayerResponseModel> HomeTeamRoster { get; set; } public List<PlayerResponseModel> AwayTeamRoster { get; set; } } public class TeamResponseModel { public string Name { get; set; } public string Location { get; set; } } public class PlayerResponseModel { // 球员相关属性 }
目标模型需要将阵容集合作为Team的属性:
public class Game { public int Id { get; set; } public DateTime Start { get; set; } public Team HomeTeam { get; set; } public Team AwayTeam { get; set; } } public class Team { public string Name { get; set; } public string Location { get; set; } public List<Player> Roster { get; set; } } public class Player { // 映射后的球员属性 }
你原尝试的配置会引发空引用异常,因为AutoMapper不会自动初始化HomeTeam/AwayTeam对象就去设置其Roster属性,以下是两种可行的实现方式:
方案一:使用MapFrom构建完整Team对象
通过MapFrom的重载,结合已有的映射规则,将原TeamResponseModel的属性和对应阵容合并为目标Team对象:
CreateMap<PlayerResponseModel, Player>(); CreateMap<TeamResponseModel, Team>(); CreateMap<GameResponseModel, Game>() .ForMember(dest => dest.HomeTeam, opt => opt.MapFrom((src, _, _, context) => { var team = context.Mapper.Map<Team>(src.HomeTeam); team.Roster = context.Mapper.Map<List<Player>>(src.HomeTeamRoster); return team; })) .ForMember(dest => dest.AwayTeam, opt => opt.MapFrom((src, _, _, context) => { var team = context.Mapper.Map<Team>(src.AwayTeam); team.Roster = context.Mapper.Map<List<Player>>(src.AwayTeamRoster); return team; }));
方案二:使用AfterMap后置操作
先完成GameResponseModel到Game的基础映射,再在映射完成后为Team的Roster属性赋值:
CreateMap<PlayerResponseModel, Player>(); CreateMap<TeamResponseModel, Team>(); CreateMap<GameResponseModel, Game>() .AfterMap((src, dest, context) => { dest.HomeTeam.Roster = context.Mapper.Map<List<Player>>(src.HomeTeamRoster); dest.AwayTeam.Roster = context.Mapper.Map<List<Player>>(src.AwayTeamRoster); });
这种方式需要确保TeamResponseModel不为null,AutoMapper会自动映射出对应的Team实例,避免空引用。
内容的提问来源于stack exchange,提问作者Santi
相关产品推荐
相关产品推荐

