首页 > 解决方案 > Azure 函数 - 你可以在函数范围之前访问 IServiceProvider 吗?

问题描述

嗨,我有一个用例,希望在天蓝色函数项目中的函数调用之前获得对 IServiceProvider 的访问权限。

尝试:

  1. 使用 IWebJobsStartup cs 文件,我可以在函数调用之前访问 serviceCollection。最后我尝试了这段代码

     var serviceProvider = services.BuildServiceProvider();
     serviceProvider.GetRequiredService<IAccountAPITests>();
    

错误消息“System.InvalidOperationException: 'Unable to resolve service for type 'Microsoft.Azure.WebJobs.Script.IFileLoggingStatusManager' while trying to activate 'Microsoft.Azure.WebJobs.Script.Diagnostics.HostFileLoggerProvider'.'”

到目前为止,我唯一可以访问 IServiceCollection 是在我的功能中

 public TestAutomationFunction
    (
        IServiceProvider rootServiceProvider
    )
    {

        _integrationTestService = rootServiceProvider.GetRequiredService<IIntegrationTestService>();
    }

这很好用,但问题是函数是作用域的,因此在其中解决的任何问题都将绑定到其相同的作用域。

我尽力描绘了为什么我在 ASP.net 中没有这个问题以及为什么我在函数中这样做。

我想在函数调用之前访问 IServiceProvider 以确保我的服务不在同一范围内。或者在调用该函数后,在一个单独的范围内解析我的服务。

我当然可以将 Package X 单例更改为范围,但我的用例并不像它在我的堆栈深处那么简单,我必须一直这样做。

在此处输入图像描述

标签: c#azure-functions

解决方案


这并没有完全回答我的问题,但它使我的问题成为一个静音点。

“不要从单例中解析范围服务。这可能会导致服务在处理后续请求时出现不正确的状态。可以从范围或临时服务中解析单例服务。”

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.0#service-lifetimes

我将重新处理我的堆栈以防止这种情况发生,之后我将不必担心这个问题。


推荐阅读