.NET Core 2.0控制台应用中AutoMapper依赖注入配置及错误解决
解决.NET Core 2.0控制台应用中AutoMapper依赖注入的空引用问题
嘿,我来帮你搞定这个AutoMapper依赖注入的坑!你遇到的Object reference not set to an instance of an object错误,主要是两个关键问题导致的,咱们一步步来修正:
问题根源分析
- 服务注册顺序错误:你先调用了
BuildServiceProvider(),之后才注册IMapper——这时候容器已经构建完成,后面加的服务根本没被纳入容器,所以获取IMapper时自然会返回null,触发空引用。 - 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
相关产品推荐
相关产品推荐

