在.NET Core 3.1中使用Automapper 2.2.1解析器报无默认构造函数如何解决
问题原因
AutoMapper 2.2.1版本默认会通过无参构造函数实例化自定义的ValueResolver,无法直接对接.NET Core的依赖注入容器,所以会抛出找不到默认构造函数的异常。
方案1:升级AutoMapper到支持依赖注入的版本(推荐)
.NET Core环境下更建议使用适配了DI体系的AutoMapper版本,兼容性和稳定性更好:
- 卸载现有2.2.1版本AutoMapper,安装兼容.NET Core 3.1的AutoMapper v10.x版本,同时安装
AutoMapper.Extensions.Microsoft.DependencyInjection扩展包 - 在Startup.cs中注册AutoMapper服务:
// 传入存放映射配置Profile的程序集所属的类型即可 services.AddAutoMapper(typeof(Startup));
- 调整映射配置为Profile类写法:
public class CustomProfile : Profile { public CustomProfile() { CreateMap<a, b>() .ForMember(dest => dest.prop, opt => opt.MapFrom<Resolver>()); } }
- 将Resolver及其所有依赖都注册到DI容器,生命周期可按需调整:
services.AddTransient<Resolver>(); // 你的依赖服务注册示例,按实际实现调整 services.AddScoped<IParamUtil, ParamUtilImpl>(); services.AddScoped<IParamValue, ParamValueImpl>(); services.AddScoped<IProductDao, ProductDaoImpl>(); services.AddSingleton<MessageResources>();
配置完成后AutoMapper会自动从DI容器中获取Resolver实例,无需无参构造函数,依赖会自动注入。
方案2:保留AutoMapper 2.2.1版本的兼容处理
如果因历史业务原因不能升级版本,可以手动指定AutoMapper的服务构造工厂,对接.NET Core的DI容器:
- 在Startup.cs的Configure方法中配置AutoMapper初始化:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider) { Mapper.Initialize(cfg => { // 指定AutoMapper从DI容器中获取服务实例 cfg.ConstructServicesUsing(serviceProvider.GetService); // 原有映射配置 cfg.CreateMap<a, b>() .ForMember(dest => dest.prop, opt => opt.ResolveUsing<Resolver>().FromMember(src => src)); }); }
- 和方案1一致,将Resolver及其所有依赖都注册到DI容器中。
注意:AutoMapper 2.2.1的静态Mapper是全局单例,
Mapper.Initialize只能执行一次,重复调用会覆盖已有配置,且高并发场景下容易出现线程安全问题,有条件优先选择方案1。
内容的提问来源于stack exchange,提问作者sameera guntimadugu
相关产品推荐
相关产品推荐

