在控制台应用运行Nopcommerce,调用engine.Resolve返回null如何解决
问题原因
- 未完成Nop引擎的初始化绑定:调用
EngineContext.Create()仅创建了引擎实例,但未将构建完成的Host服务容器绑定到引擎,引擎内部无已注册的服务实例,因此Resolve返回null - 未正确处理服务生命周期:
ICategoryService属于Scope生命周期的服务,直接从根服务容器解析会失败 - 可选触发原因:若App_Data下的配置文件异常、数据库连接串无效,会导致数据层、服务层相关服务注册失败,也会出现解析返回null的情况
解决方案
按以下步骤修改即可:
- Host构建完成后先启动Host,再完成Nop引擎的初始化绑定
- 解析Scope生命周期服务前,先创建独立的服务Scope
- 提前校验App_Data下
appsettings.json的数据库连接串配置正确性
修正后的核心代码如下:
namespace Nop.Console { class Program { static void Main(string[] args) { using var host = Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => webBuilder .ConfigureAppConfiguration(config => { config .AddJsonFile(NopConfigurationDefaults.AppSettingsFilePath, true, true) .AddEnvironmentVariables(); }) .UseStartup<Startup>()) .Build(); // 启动Host完成所有服务注册 host.Start(); // 初始化Nop引擎,绑定当前Host的服务容器 var engine = EngineContext.Create(); engine.Initialize(host.Services); // 创建Scope后再解析Scoped生命周期的服务 using var scope = engine.Services.CreateScope(); var cs = scope.ServiceProvider.GetRequiredService<ICategoryService>(); System.Console.WriteLine("Hello World!"); // 仅做数据迁移的话,执行完自定义逻辑后可直接关闭Host host.WaitForShutdown(); } } }
内容的提问来源于stack exchange,提问作者AmirHossein
相关产品推荐
相关产品推荐

