You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:35:25