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

.NET Core 2.0控制台应用中AutoMapper依赖注入配置及错误解决

解决.NET Core 2.0控制台应用中AutoMapper依赖注入的空引用问题

嘿,我来帮你搞定这个AutoMapper依赖注入的坑!你遇到的Object reference not set to an instance of an object错误,主要是两个关键问题导致的,咱们一步步来修正:

问题根源分析

  1. 服务注册顺序错误:你先调用了BuildServiceProvider(),之后才注册IMapper——这时候容器已经构建完成,后面加的服务根本没被纳入容器,所以获取IMapper时自然会返回null,触发空引用。
  2. AutoMapper配置缺失:直接注册IMapper是不行的,AutoMapper需要知道如何映射你的类,必须先配置映射规则,再通过官方的DI扩展来注册服务。

正确配置步骤

第一步:安装必要的NuGet包

首先得装两个包:

  • AutoMapper:核心库
  • AutoMapper.Extensions.Microsoft.DependencyInjection:AutoMapper针对.NET Core依赖注入的扩展包(.NET Core 2.0必须用这个来集成DI)

你可以在NuGet包管理器里搜索安装,或者用命令行:

Install-Package AutoMapper
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection

第二步:定义映射规则(两种方式可选)

方式一:使用Profile类(推荐)

创建一个继承自Profile的类,在构造函数里定义映射规则:

public class CurrencyMappingProfile : Profile
{
    public CurrencyMappingProfile()
    {
        // 这里替换成你实际的源类和目标类映射规则
        CreateMap<YourSourceClass, YourDestinationClass>()
            // 如果有字段名不一致的情况,手动指定映射关系
            .ForMember(dest => dest.DestField, opt => opt.MapFrom(src => src.SourceField));
    }
}

方式二:手动创建MapperConfiguration

如果不想用Profile,也可以直接创建配置对象:

var mapperConfig = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<YourSourceClass, YourDestinationClass>()
        .ForMember(dest => dest.DestField, opt => opt.MapFrom(src => src.SourceField));
});

第三步:正确注册服务到DI容器

现在在Main方法里按正确顺序注册服务:

static void Main(string[] args)
{
    // 1. 初始化服务集合
    var services = new ServiceCollection();

    // 2. 注册AutoMapper服务
    // 如果用Profile类,指定包含Profile的程序集(这里用typeof(CurrencyMappingProfile)来定位)
    services.AddAutoMapper(typeof(CurrencyMappingProfile));

    // 如果你用手动配置的MapperConfiguration,替换成下面两行:
    // services.AddSingleton(mapperConfig);
    // services.AddSingleton<IMapper>(sp => mapperConfig.CreateMapper());

    // 3. 注册你的AutoGetCurrency类(它依赖IMapper,所以要注册到容器)
    services.AddTransient<AutoGetCurrency>();

    // 4. 最后再构建服务提供者!这一步必须放在所有服务注册完成之后
    var serviceProvider = services.BuildServiceProvider();

    // 5. 获取实例并使用
    var autoGetCurrency = serviceProvider.GetRequiredService<AutoGetCurrency>();
    // 这里就可以调用autoGetCurrency的方法来测试映射了
}

关键注意事项

  • 永远先注册所有服务,再构建容器:BuildServiceProvider()是“冻结”容器的操作,之后添加的服务不会被容器识别。
  • 不要直接注册IMapper:必须通过AddAutoMapper扩展方法或者手动注册MapperConfiguration+IMapper的方式,让AutoMapper能正确初始化映射规则。
  • 确保映射规则覆盖所有需要转换的类:如果某个类没配置映射,AutoMapper在转换时也会报错。

这样配置完之后,你的AutoGetCurrency类就能通过构造函数正确获取到IMapper实例,空引用的问题就解决啦!

内容的提问来源于stack exchange,提问作者Uladz Kha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:43:58