通常在 .NET Core 项目中,我会创建一个“引导”类来配置我的服务以及 DI 注册命令。这通常是一个扩展方法IServiceCollection
我可以在哪里调用类似的方法.AddCosmosDbService
并且所有必要的东西都是包含该方法的静态类中的“独立”。但关键是该方法得到一个IConfiguration
来自Startup
class.
我过去曾在 Azure Functions 中使用过 DI,但尚未遇到此特定要求。
我正在使用IConfiguration
绑定到一个具体类,其属性与我的两个设置相匹配local.settings.json
以及在 Azure 中部署该函数时的开发/生产应用程序设置。
CosmosDbClientSettings.cs
/// <summary>
/// Holds configuration settings from local.settings.json or application configuration
/// </summary>
public class CosmosDbClientSettings
{
public string CosmosDbDatabaseName { get; set; }
public string CosmosDbCollectionName { get; set; }
public string CosmosDbAccount { get; set; }
public string CosmosDbKey { get; set; }
}
BootstrapCosmosDbClient.cs
public static class BootstrapCosmosDbClient
{
/// <summary>
/// Adds a singleton reference for the CosmosDbService with settings obtained by injecting IConfiguration
/// </summary>
/// <param name="services"></param>
/// <param name="configuration"></param>
/// <returns></returns>
public static async Task<CosmosDbService> AddCosmosDbServiceAsync(
this IServiceCollection services,
IConfiguration configuration)
{
CosmosDbClientSettings cosmosDbClientSettings = new CosmosDbClientSettings();
configuration.Bind(nameof(CosmosDbClientSettings), cosmosDbClientSettings);
CosmosClientBuilder clientBuilder = new CosmosClientBuilder(cosmosDbClientSettings.CosmosDbAccount, cosmosDbClientSettings.CosmosDbKey);
CosmosClient client = clientBuilder.WithConnectionModeDirect().Build();
CosmosDbService cosmosDbService = new CosmosDbService(client, cosmosDbClientSettings.CosmosDbDatabaseName, cosmosDbClientSettings.CosmosDbCollectionName);
DatabaseResponse database = await client.CreateDatabaseIfNotExistsAsync(cosmosDbClientSettings.CosmosDbDatabaseName);
await database.Database.CreateContainerIfNotExistsAsync(cosmosDbClientSettings.CosmosDbCollectionName, "/id");
services.AddSingleton<ICosmosDbService>(cosmosDbService);
return cosmosDbService;
}
}
启动.cs
public class Startup : FunctionsStartup
{
public override async void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient();
await builder.Services.AddCosmosDbServiceAsync(**need IConfiguration reference**); <--where do I get IConfiguration?
}
}
显然添加了一个私有字段IConfiguration
in Startup.cs
不会工作,因为它需要填充一些东西,我也读过使用 DI 用于IConfiguration这不是一个好主意 https://github.com/Azure/azure-functions-host/issues/4464.
我也尝试过使用所描述的选项模式here https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#function-app-provided-services并按如下方式实施:
builder.Services.AddOptions<CosmosDbClientSettings>()
.Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));
虽然这将有助于注入IOptions<CosmosDbClientSettings>
对于非静态类,我使用静态类来保存我的配置工作。
关于如何使这项工作或可能的解决方法有什么建议吗?我更愿意将所有配置保留在一处(引导文件)。