Asp.net 核心 MVC - 在应用程序关闭期间获取依赖项

Asp.net Core MVC - obtaining dependency during app shutdown

我正在使用 ASP.net Core MVC 2.2 开发网络应用程序,在我的 Startup class 中,我正在注册 MyService 类型的依赖注入,像这样:

public void ConfigureServices(IServiceCollection services)
{
    //Inject dependency
    services.AddSingleton<MyService>();

    //...other stuff...
}

这工作正常。但是,我需要在应用程序关闭期间检索 MyService 的实例,以便在应用程序终止之前执行一些清理操作。

所以我尝试这样做 - 首先我在我的启动 class 中注入 IServiceProvider,所以它可用:

public Startup(IConfiguration configuration, IServiceProvider serviceProvider)
{
    ServiceProvider = serviceProvider;
    Configuration = configuration;
}

然后,在 Configure 方法中,我配置了一个钩子到 ApplicationStopping 事件,以拦截关机并调用 OnShutdown 方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime)
{
    //Register app termination event hook
    applicationLifetime.ApplicationStopping.Register(OnShutdown);

    //...do stuff...
}

最后,在我的 OnShutdown 方法中,我尝试获取我的依赖项并使用它:

private void OnShutdown()
{
    var myService = ServiceProvider.GetService<MyService>();
    myService.DoSomething(); //NullReference exception, myService is null!
}

但是,从代码中的注释可以看出,这是行不通的:返回的依赖项始终为空。我在这里做错了什么?

我能够通过像这样将您的应用程序服务显式传递给您的关闭方法来使其工作。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime)
{
    //Register app termination event hook
    applicationLifetime.ApplicationStopping.Register(() => OnShutdown(app.ApplicationServices));

     //...do stuff...
}


private void OnShutdown(IServiceProvider serviceProvider)
{
        var myService = serviceProvider.GetService<MyService>();
         myService.DoSomething();
}

请记住,这将适用于单例服务 - 如果您想解析作用域服务,您可能必须 CreateScope()