【问题标题】:Asp.net Core MVC - obtaining dependency during app shutdownAsp.net Core MVC - 在应用程序关闭期间获取依赖项
【发布时间】:2020-01-14 01:11:57
【问题描述】:

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

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

    //...other stuff...
}

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

所以我尝试这样做——首先我在我的启动类中注入了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!
}

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

【问题讨论】:

    标签: c# asp.net-core .net-core asp.net-core-mvc asp.net-core-2.2


    【解决方案1】:

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

    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()

    【讨论】:

    • 这非常有效。我不知道提供者是否真的被处置了(如果是这种情况,它不应该抛出一些异常吗?)但是像你一样在 lambda 中捕获它解决了问题!谢谢。
    • @Master_T 我的下一个猜测是您在启动类构造函数中注入您的ServiceProvider,在注入时您的服务提供者尚未构建。
    • @cl0ud 你是怎么知道使用 lambda 表达式的?我正在尝试 .Register(OnShutdown(app.ApplicationServices) 并收到错误。
    • @PaulMcCarthy 说实话 - Resharper 建议这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多