.NET Core中带依赖的AutoMapper自定义ValueResolver报无参构造错如何解决
问题原因
你遇到的异常核心原因是手动实例化了AutoMapper的Mapper实例,没有使用依赖注入容器托管的IMapper对象,导致AutoMapper无法从DI容器中获取带构造参数的自定义值解析器,只能尝试调用无参构造函数实例化解析器,因此触发报错。
另外还有一个配置问题:你注册值解析器时注册的是IValueResolver<,>接口,而AutoMapper默认按解析器的具体实现类型从容器拉取实例,接口注册不会生效。
解决步骤
- 第一步:把映射配置移到AutoMapper的Profile类中,避免手动创建MapperConfiguration
// 新建映射配置类,继承Profile public class MappingProfile : Profile { public MappingProfile() { CreateMap<Model.Db.Kontoauszug, KontoauszugDetailViewModel>() .ForMember(dest => dest.IsTeamleiter, opt => opt.MapFrom<KontoauszugIsTeamleiterResolver>()); } }
- 第二步:调整DI注册逻辑,直接注册值解析器的具体实现类,同时确保
ISysParamService已经提前注册到DI容器
// Startup.cs / Program.cs 注册代码 services.AddAutoMapper(typeof(Startup)); // 会自动扫描当前程序集所有Profile类加载配置 // 直接注册值解析器的具体类型,不要注册接口 services.AddScoped<KontoauszugIsTeamleiterResolver>();
- 第三步:删除所有手动创建MapperConfiguration、Mapper实例的代码,通过构造函数注入托管的
IMapper实例使用
// 在需要做映射的业务类中注入IMapper public class KontoauszugService { private readonly IMapper _mapper; // 构造函数注入,容器会自动传入托管的IMapper实例 public KontoauszugService(IMapper mapper) { _mapper = mapper; } public KontoauszugDetailViewModel GetDetail(Model.Db.Kontoauszug kontoauszug) { // 直接使用注入的mapper做映射,不需要手动实例化 return _mapper.Map<KontoauszugDetailViewModel>(kontoauszug); } }
内容的提问来源于stack exchange,提问作者xeraphim
相关产品推荐
相关产品推荐

