基于消息信息的 Azure Function Service Bus 的依赖注入

Dependency Injection for AzureFunction ServiceBus based on message information

我正在处理处理多租户消息的 AzureFunction ServiceBus v3。在消息中,我将拥有 TenantId,并且我需要根据此 TenantId 为每条消息注册 DependencyInjection。 到目前为止我尝试了什么:

  1. 在启动时,我将 IServiceCollection 存储为静态变量

  2. 从 Function 的 运行 方法中的序列化消息中检索 TenantId

  3. 根据上述TenantId更新IServiceCollection并获取Service

    _serviceCollection.AddTransient<ITenantIdResolver>(ctx => { return new CompanyResolver{TenantId=tenantId}; }); var service = _serviceCollection.BuildServiceProvider().GetService<T>();

但它抛出异常:Unable to resolve service for type 'Microsoft.Azure.WebJobs.Script.IEnvironment' while attempting to activate 'Microsoft.Azure.WebJobs.Script.Configuration.ScriptHostOptionsSetup'我做了一些研究,看起来是因为我使用了 IHttpClientFactory。 我该如何解决这个问题?

或者如果有一种方法可以在 StartUp 中检索消息,这样我就可以正确地注入 tenantId,那就更好了?像 serviceCollection.AddTransient<ITenantIdResolver>(ctx => { var tenantId = GetServicebusMessage().TenantId; return new CompanyResolver { TenantId=tenantId }; }

根据Dependency injection for azure functions,无法在早期使用这些服务。

我的建议是将体系结构更改为“持久编排”,这样您就可以从编排器中调用 ActivityTrigger 函数,该函数会返回租户列表,然后触发其他 ActivityTriggers 来处理它们。

我认为事情的顺序是错误的。应该在处理消息之前设置依赖注入。

解析器可能是一种解决方案。向依赖注入容器注册解析器,让函数依赖于解析器。根据您从解析器获得正确实例的消息。在本文中,它在“IoC 容器注册 #3 – 解析器 + 工厂方法模式”下有更好的解释:https://techcommunity.microsoft.com/t5/apps-on-azure/dependency-injection-on-azure-functions-5-ways-selecting/ba-p/1502394