如何在AutoMapper Profile中调用异步可等待方法
解决AutoMapper Profile中无法直接使用异步方法的问题
方案1:提前获取异步数据,再执行映射
既然Profile的配置逻辑不支持异步操作,最直接的处理方式是在调用Map方法前先异步获取所需数据,再通过映射上下文传递给配置逻辑。
示例代码:
// 先异步获取数据 var nextSequence = await sequence.GetNext(); // 映射时通过上下文传入数据 var user = mapper.Map<UserDto, User>(userDto, opt => opt.Items["NextSequence"] = nextSequence); // 对应Profile配置 public class UserProfile : AutoMapper.Profile { public UserProfile() { CreateMap<UserDto, User>() .ForMember(dest => dest.UserId, opt => opt.MapFrom((src, dest, _, context) => context.Items["NextSequence"])); } }
方案2:使用自定义异步值解析器
AutoMapper支持通过实现IAsyncValueResolver接口封装异步逻辑,再在Profile中指定使用该解析器。
第一步:实现异步值解析器
public class SequenceValueResolver : IAsyncValueResolver<UserDto, User, int> { private readonly ISequence _sequence; public SequenceValueResolver(ISequence sequence) { _sequence = sequence; } public async Task<int> Resolve(UserDto source, User destination, int destMember, ResolutionContext context) { return await _sequence.GetNext(); } }
第二步:在Profile中配置解析器
public class UserProfile : AutoMapper.Profile { public UserProfile() { CreateMap<UserDto, User>() .ForMember(dest => dest.UserId, opt => opt.ResolveUsing<SequenceValueResolver>()); } }
第三步:调用异步映射方法
必须使用AutoMapper的MapAsync方法触发异步解析逻辑,不能用普通同步Map方法:
var user = await mapper.MapAsync<User>(userDto);
关键注意事项
- 禁止在Profile的
CreateMap配置中直接传入异步委托,同步映射管道不支持异步逻辑,会引发死锁或任务未完成问题。 - 使用异步值解析器时,必须搭配
MapAsync执行映射,否则异步逻辑不会被触发。
内容的提问来源于stack exchange,提问作者Saghar Francis
相关产品推荐
相关产品推荐

