ASP.NET Core Web API类库中AutoMapper映射失败问题排查
问题排查与解决方案
1. 修正AutoMapper程序集扫描范围
你当前在Program.cs中指定的扫描程序集是typeof(AppraisalProfile).Assembly,但实际生效的映射配置类是InteractionGroupProfile。如果这两个类不在同一个类库程序集内,AutoMapper将无法找到InteractionGroupProfile的映射规则。
修改注册代码,改为扫描InteractionGroupProfile所在的程序集:
services.AddAutoMapper(typeof(Program).Assembly, typeof(InteractionGroupProfile).Assembly);
这样AutoMapper会同时扫描API项目和包含InteractionGroupProfile的类库项目中的所有Profile配置。
2. 修复值解析器的代码逻辑与循环依赖问题
你的Resolve方法存在两处问题:
- 变量声明顺序错误:先执行
employees.ForEach向employeeDtos添加元素,但employeeDtos是在循环后才声明的,会导致运行时异常或返回空列表。 - 注入
IMapper引发循环依赖:值解析器依赖IMapper,而IMapper又依赖值解析器,会导致DI容器无法正常创建实例。
调整后的代码:
public List<EmployeeDTO> Resolve(InteractionGroup source, InteractionGroupDTO destination, List<EmployeeDTO> destMember, ResolutionContext context) { List<EmployeeDTO> employeeDtos = new List<EmployeeDTO>(); // 补充从数据库获取employees的逻辑,示例: var employees = dBContext.Employees.Where(e => /* 你的过滤条件,比如关联InteractionGroup */).ToList(); employees.ForEach(e => { var dto = context.Mapper.Map<EmployeeDTO>(e); // 使用ResolutionContext自带的Mapper避免循环依赖 employeeDtos.Add(dto); }); return employeeDtos; }
3. 补充缺失的映射配置
值解析器中需要将Employee映射为EmployeeDTO,如果没有对应的映射规则,会触发类型映射缺失错误。添加对应的Profile:
public class EmployeeProfile : Profile { public EmployeeProfile() { CreateMap<Employee, EmployeeDTO>(); } }
确保该Profile所在的程序集已被AutoMapper扫描覆盖(步骤1已处理)。
4. 验证DI容器注册完整性
- 确认
Appraisal360DBContext已正确注册到DI:services.AddDbContext<Appraisal360DBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("YourConnectionString"))); - 确认业务类的接口与实现已注册:
services.AddScoped<IInteractionGroupQueryFacade, InteractionGroupQueryFacade>();
5. 启动时验证映射配置
在Program.cs中添加映射配置验证,提前排查错误:
var serviceProvider = services.BuildServiceProvider(); var mapper = serviceProvider.GetRequiredService<IMapper>(); mapper.ConfigurationProvider.AssertConfigurationIsValid();
这段代码会在应用启动时检查所有映射规则的完整性,有错误直接抛出,避免运行时才暴露问题。
内容的提问来源于stack exchange,提问作者Ali.Rashidi
相关产品推荐
相关产品推荐

