当前位置: 首页 > 知识库问答 >
问题:

Azure 函数 V3 依赖关系注入生存期问题

魏书
2023-03-14

我正在使用Azure函数v3和DI。我有一个服务,我在启动时设置了一个短暂的生命周期。cs(使用:builder.Services.AddTransient

我希望对于每个队列消息,我将获得我的“coreApiService”的一个单独实例,但当多个消息同时放入队列时,我似乎正在共享一个实例。

我希望为每个调用或“运行”获得一个单独的实例是不正确的吗?我遇到的问题是“_coreApiClient”似乎在Run方法的多个调用之间共享,因此当我在其中设置属性(如“客户ID”或“API密钥”等)时,我对一条消息有效,并且应该在该消息的处理中保持不变,因为它开始处理下一条消息。

是我做错了还是我没有正确理解生命?

这是我的启动代码:

public class Startup: FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddLogging();
            
            var loggingService = new HttpLoggingService(Environment.GetEnvironmentVariable("LoggingURL"), 0, "ABC.Integrations");
            builder.Services.AddTransient<ILoggingService>(s => loggingService);

            int CoreApiTimeout = 60;  //Environment.GetEnvironmentVariable("CoreApiTimeout")
            var coreApiService = new CoreApiClient(Environment.GetEnvironmentVariable("CoreApiKey"),string.Empty, CoreApiTimeout,Environment.GetEnvironmentVariable("CoreApiBaseUrl"));
            builder.Services.AddTransient<ICoreApiClient>(s => coreApiService);
           
        }
    }

和我的Azure Function类:

public class TaskRouter
    {
        private readonly ICoreApiClient _coreApiClient;
        private readonly ILoggingService _upgLogger;
        private readonly ILogger<TaskRouter> _log;        

        public TaskRouter(ICoreApiClient coreApiClient, ILoggingService upgLogger, ILogger<TaskRouter> log)
        {
            _coreApiClient = coreApiClient;
            _upgLogger = upgLogger;
            _log = log;
            
        }

        [FunctionName("RouteTask")]
        [ExponentialBackoffRetry(5, "00:00:04", "00:03:00")]
        public async Task Run([QueueTrigger("task-scheduler", Connection = "")]
            string queueItem)
        {

            
                //Call Appropriate Function to start task
                var taskMsg = JsonConvert.DeserializeObject<TaskMessage>(queueItem);
                                
                _coreApiClient.SetId(taskMsg.TaskNumber);
                
                //DO SOME WORK HERE
                
                Console.Log(_coreApiClient.GetId);  //Will be different b/c this was set by the next message
        }
   }

共有1个答案

孙泉
2023-03-14

尽管客户端在容器中注册为瞬态,但它实际上是一个单例,因为在 Startup 中创建的实例是每次调用注入 ICoreApiClient 时将返回的唯一实例。

将实例创建移动到factory委托中,使其成为实际的临时注册,以便每次必须从服务提供商解析iCorapClient时都会初始化新实例。

//...

builder.Services.AddTransient<ICoreApiClient>(s => 
    new CoreApiClient(Environment.GetEnvironmentVariable("CoreApiKey"), string.Empty, CoreApiTimeout, Environment.GetEnvironmentVariable("CoreApiBaseUrl"))
);

//...
 类似资料:
  • 我有一个时间触发的Azure功能

  • 我有一个关于 azure 函数 v1 中的依赖注入的新问题。 实际情况: 我有一个azure函数V1,我想在其中引用我的业务服务,而无需重新发明轮子即可使用我的服务。我在Internet上搜索并找到了这篇来自Microsoft的有趣文章。 但是,它似乎只适用于azure函数v2(. net core),因为每当我尝试安装时,我总是收到以下错误: 检测到Microsoft.Azure.WebJobs

  • 我已经能够让用net core编写的Azure函数运行。我现在添加了对“WindowsAzure.存储”的引用,现在当我使用本地测试环境(“func主机启动”)时,我得到了加载体验。 我不能使用默认的表存储绑定器,因为我需要在不同的表中重新插入记录。 我使用预编译函数,正在OSX上使用VSCode进行开发。如果支持或不支持此方案,我找不到任何信息。甚至有可能让外部依赖项与Azure函数的2.0运行

  • 我已经成功地将依赖注入用于我自己的自定义服务,如本文所述。 我想要的是在我的定制服务中使用框架作为参数注入Azure函数的绑定器。用作函数参数的示例: 我尝试将Binder作为参数添加到我的服务构造函数并让框架创建我的服务实例,但传入的Binder始终为空。 我的服务构造函数: 注册如下: 有人知道这是否可能吗?如果可能,我做错了什么?

  • 我一直在尝试为Azure函数实现DI,其中函数由ServiceBus触发(本例中为主题/订阅): 我在以下网站上阅读了有关Azure Functions和DI的信息: https://mcguirev10.com/2018/04/03/service-locator-azure-functions-v2.html https://blog.wille-zone.de/post/azure-func

  • 我使用 .NET 5 创建了一个 Azure 函数版本 3,并通过类的构造函数进行依赖关系注入。请参阅下面的虚拟代码: 在类中添加了范围。 程序文件如下所示: 在文件中有这行代码: 问题是当我想运行 Azure 函数时。我有这个警告: 未找到作业函数。试着公开你的作业类和方法。如果您使用的是绑定扩展(例如Azure存储、ServiceBus、定时器等),请确保您在启动代码中调用了扩展的注册方法(例