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

AutoMapper中使用带参数自定义值解析器报错的解决咨询

问题

使用AutoMapper实现Sourcingbundle与ResponsibleDto的映射时,将三个重复的IValueResolver合并为一个接收ResponsibleType枚举参数的ResponsiblePersonResolver,但在映射配置中实例化该解析器时,出现依赖注入无法解析ResponsibleType的错误。

错误原因

通过AddAutoMapper集成依赖注入时,AutoMapper会自动扫描程序集中所有IValueResolver实现,并将它们注册为Transient服务。此时在MapFrom中手动创建解析器实例时,AutoMapper会优先尝试从DI容器获取该解析器的实例,而DI容器无法解析枚举类型ResponsibleType(未被注册为服务),导致激活解析器失败。

解决方案

方法1:使用ResolveUsing指定手动实例化的解析器

将映射配置中的MapFrom替换为ResolveUsing,AutoMapper会直接使用你传入的解析器实例,不会触发DI容器的解析逻辑:

private class Mapping : Profile
{
    public Mapping()
    {
        CreateMap<Sourcingbundle, ResponsibleDto>()
            .ForMember(dto => dto.BtvPurchasedPartPlanner, 
                cfg => cfg.ResolveUsing(new ResponsiblePersonResolver(ResponsibleType.MM_PLAN)))
            .ForMember(dto => dto.BrManager, 
                cfg => cfg.ResolveUsing(new ResponsiblePersonResolver(ResponsibleType.MM_MANAGE)))
            .ForMember(dto => dto.MgMstSpokesperson, 
                cfg => cfg.ResolveUsing(new ResponsiblePersonResolver(ResponsibleType.MM_SPOKESMAN)));
    }
}

方法2:通过Lambda表达式直接调用解析逻辑

如果不想修改方法名,可使用MapFrom的Lambda重载,手动创建解析器并调用Resolve方法:

private class Mapping : Profile
{
    public Mapping()
    {
        CreateMap<Sourcingbundle, ResponsibleDto>()
            .ForMember(dto => dto.BtvPurchasedPartPlanner, 
                cfg => cfg.MapFrom((source, dest, _, context) => 
                    new ResponsiblePersonResolver(ResponsibleType.MM_PLAN).Resolve(source, dest, null, context)))
            .ForMember(dto => dto.BrManager, 
                cfg => cfg.MapFrom((source, dest, _, context) => 
                    new ResponsiblePersonResolver(ResponsibleType.MM_MANAGE).Resolve(source, dest, null, context)))
            .ForMember(dto => dto.MgMstSpokesperson, 
                cfg => cfg.MapFrom((source, dest, _, context) => 
                    new ResponsiblePersonResolver(ResponsibleType.MM_SPOKESMAN).Resolve(source, dest, null, context)));
    }
}

方法3:禁止AutoMapper自动注册该解析器(可选)

若希望保留MapFrom调用方式,可在注册AutoMapper时排除ResponsiblePersonResolver,避免它被注册到DI容器:

serviceCollection.AddAutoMapper(
    cfg =>
    {
        cfg.DestinationMemberNamingConvention = new LowerUnderscoreNamingConvention();
    },
    // 排除目标解析器
    types => types.Where(t => t != typeof(ResponsibleDto.ResponsiblePersonResolver)),
    Assembly.GetExecutingAssembly());

此方法相对繁琐,推荐优先使用前两种方案。

验证修改

修改完成后,AutoMapper将直接使用手动创建的解析器实例,不再触发DI容器对ResponsibleType的解析请求,错误即可解决。

内容的提问来源于stack exchange,提问作者Tarik Nukic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:15:55