Обычно в проекте .NET Core я создаю класс boostrap для настройки моей службы вместе с командами регистрации DI. Обычно это метод расширения, в IServiceCollection
котором я могу вызвать такой метод, .AddCosmosDbService
и все необходимое «самодостаточно» в статическом классе, содержащем этот метод. Ключ , однако, что метод получает IConfiguration
от Startup
класса.
В прошлом я работал с DI в функциях Azure, но еще не сталкивался с этим конкретным требованием.
Я использую IConfiguration
для привязки к конкретному классу свойства, совпадающие с настройками как из моего, local.settings.json
так и из параметров приложения dev / production, когда функция развернута в 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;
}
}
Startup.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
не очень хорошая идея .
Я также попытался использовать шаблон параметров, как описано здесь, и реализован так:
builder.Services.AddOptions<CosmosDbClientSettings>()
.Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));
В то время как это будет работать для внедрения IOptions<CosmosDbClientSettings>
нестатического класса, я использую статический класс для хранения своей работы по настройке.
Любые предложения о том, как я могу сделать эту работу или возможное решение? Я бы предпочел хранить всю конфигурацию в одном месте (файл начальной загрузки).
host.json
параметры не используются, в частности,routePrefix