Azure Service Bus函数瞬态依赖注入是否每次运行生效?如何避免GUID重复?
解答
GUID重复风险说明
- 标准.NET的
Guid.NewGuid()生成的是版本4 UUID,方法本身线程安全,重复概率低到可以忽略,和服务的生命周期无直接关联。只有当你自定义实现了GUID生成逻辑、未处理并发冲突时,才有可能出现重复,这类情况优先排查生成逻辑即可。
当前Transient注册未生效的原因
Azure Function宿主默认将函数类注册为单例,因此构造函数注入的IProcessService仅会在函数类首次初始化时解析一次,后续所有触发调用都会复用同一个实例,哪怕IProcessService注册为Transient也不会自动触发每次调用重新注入。
每次调用获取全新IProcessService实例的实现方案
方案1:Run方法内手动创建作用域解析(更推荐)
将IServiceScopeFactory注入到函数类构造函数,每次调用Run方法时手动创建服务作用域,从作用域中解析IProcessService,即可保证每次调用都获取全新实例,其所有依赖也会按照注册的生命周期重新解析。
改造后代码如下:
public class ServiceBusListenerFunction { private readonly IServiceScopeFactory _scopeFactory; public ServiceBusListenerFunction(IServiceScopeFactory scopeFactory) { _scopeFactory = scopeFactory; } [FunctionName("MyServiceBusFunction")] public async Task Run([ServiceBusTrigger("my-queue")] string message) { using var serviceScope = _scopeFactory.CreateScope(); var processService = serviceScope.ServiceProvider.GetRequiredService<IProcessService>(); await processService.Run(message); } }
方案2:修改函数类生命周期为Transient
在Program.cs的服务注册逻辑中,手动将函数类注册为Transient,这样每次函数触发都会创建新的函数类实例,构造函数注入的IProcessService也会重新解析。
注册示例:
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices(services => { services.AddTransient<IProcessService, ProcessService>(); // 手动注册函数类为Transient生命周期 services.AddTransient<ServiceBusListenerFunction>(); }) .Build(); host.Run();
内容的提问来源于stack exchange,提问作者Samuel Pereira
相关产品推荐
相关产品推荐

