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

在.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:54:07