基于.NET 5的Azure Functions可否通过中间件实现服务注入?
.NET 5 Azure Functions 依赖注入相关问题解答
1. 单次函数调用作用域的服务注册
基于.NET 5的Azure Functions(隔离进程模型)完全支持注册生命周期限定为单次函数调用的服务,默认DI容器的Scoped生命周期就对应单次函数调用的生命周期,和ASP.NET Core中的请求级作用域逻辑一致。
如果需要结合函数上下文动态生成租户专属服务,可通过以下方案实现:
- 先在启动配置中注册租户服务的抽象,可搭配工厂模式动态生成实例:
// Program.cs 中注册 services.AddScoped<ITenantSpecificService>(sp => { // 从当前作用域获取FunctionContext,读取租户信息生成对应实例 var context = sp.GetRequiredService<FunctionContext>(); var tenantId = context.Items["TenantId"]?.ToString(); return new TenantSpecificService(tenantId); });
- 在自定义中间件中读取请求信息解析租户ID,存入
FunctionContext.Items即可,后续DI容器生成ITenantSpecificService实例时会自动读取对应租户信息,生成的服务可以直接注入到函数类的构造函数中。
2. 函数方法参数注入支持
.NET 5 隔离进程模型的Azure Functions原生支持方法参数注入,你示例中的写法完全可以正常运行。只要对应服务已经在DI容器中完成注册,就可以直接添加到函数方法的参数列表中,运行时会自动完成实例注入,无需手动从FunctionContext.Items中读取赋值。
示例代码如下:
public Task MyFunction(FunctionContext context, ITenantSpecificService service) { // service 已由运行时自动注入,可直接使用 }
内容的提问来源于stack exchange,提问作者Brian Vallelunga
相关产品推荐
相关产品推荐

