.NET 6无Program/Startup类的Azure Function如何启动时仅连一次Cosmos DB?
在.NET 6 Azure Functions(无Program/Startup)中复用Cosmos DB连接
对于你的场景,.NET 6的Azure Functions(in-process模型)支持通过FunctionsStartup实现依赖注入,以此注册单例的CosmosClient,让所有端点复用同一个连接实例,具体步骤如下:
1. 创建Startup类并注册CosmosClient单例
新建Startup.cs文件,用[assembly: FunctionsStartup]标记,Azure Functions会自动识别并加载这个类的配置:
using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection; using Microsoft.Azure.Cosmos; [assembly: FunctionsStartup(typeof(YourFunctionApp.Startup))] namespace YourFunctionApp { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { // 从配置中读取Cosmos DB连接字符串和数据库名称 var cosmosConnectionString = builder.GetContext().Configuration["CosmosDb:ConnectionString"]; var databaseName = builder.GetContext().Configuration["CosmosDb:DatabaseName"]; // 注册单例CosmosClient - CosmosClient本身线程安全,全局复用能避免重复建连开销 builder.Services.AddSingleton<CosmosClient>(sp => new CosmosClient(cosmosConnectionString)); // 可选:如果多个函数复用同一数据库,可直接注册Database单例 builder.Services.AddSingleton(sp => sp.GetRequiredService<CosmosClient>().GetDatabase(databaseName)); } } }
2. 在函数类中通过构造函数注入使用
在你的GET/POST/PUT等函数类里,通过构造函数注入CosmosClient或Database,无需每次请求新建对象:
示例:GET函数类
using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Azure.Cosmos; using System.Threading.Tasks; namespace YourFunctionApp { public class GetItemsFunction { private readonly Database _cosmosDatabase; // 构造函数注入已初始化的Database实例 public GetItemsFunction(Database cosmosDatabase) { _cosmosDatabase = cosmosDatabase; } [Function("GetItems")] public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req) { // 复用Database实例获取容器 var container = _cosmosDatabase.GetContainer("YourContainerName"); // 执行查询操作 var query = container.GetItemQueryIterator<YourItem>("SELECT * FROM c"); var results = await query.ReadNextAsync(); // 构建响应 var response = req.CreateResponse(System.Net.HttpStatusCode.OK); await response.WriteAsJsonAsync(results); return response; } } }
关键注意事项
- CosmosClient的设计特性:CosmosClient是线程安全的重量级对象,创建时会建立连接池,复用它能显著减少连接开销、提升性能。
- 配置项设置:确保
local.settings.json(本地开发)或Azure函数配置中包含以下项:{ "Values": { "CosmosDb:ConnectionString": "你的Cosmos DB连接字符串", "CosmosDb:DatabaseName": "目标数据库名称" } } - 若你使用的是isolated进程模型(从你的描述看大概率是in-process),则需要创建Program.cs配置DI,但in-process模型更适配你当前无Program/Startup的结构。
内容的提问来源于stack exchange,提问作者Falcon Stakepool
相关产品推荐
相关产品推荐

