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

Mas*_*r_T 5 c# asp.net-core-mvc .net-core asp.net-core asp.net-core-2.2

我正在使用 ASP.net Core MVC 2.2 开发 Web 应用程序,并且在我的Startup班级中我正在注册类型的依赖项注入MyService,如下所示:

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

    //...other stuff...
}
Run Code Online (Sandbox Code Playgroud)

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

所以我尝试这样做 - 首先我注入IServiceProvider了我的启动类,所以它是可用的:

public Startup(IConfiguration configuration, IServiceProvider serviceProvider)
{
    ServiceProvider = serviceProvider;
    Configuration = configuration;
}
Run Code Online (Sandbox Code Playgroud)

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

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

    //...do stuff...
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是,正如您从代码中的注释中看到的,这不起作用:返回的依赖项始终为空。我在这里做错了什么?

cl0*_*0ud 9

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

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();
}
Run Code Online (Sandbox Code Playgroud)

请记住,这将适用于单例服务 -CreateScope()如果您想解析范围服务,您可能必须这样做。