Зазвичай у проекті .NET Core я створив би клас «boostrap» для налаштування мого сервісу разом із командами реєстрації DI. Зазвичай це метод розширення, IServiceCollection
де я можу назвати такий метод, .AddCosmosDbService
і все необхідне є "автономним" у статичному класі, що містить цей метод. Ключове, однак, полягає в тому, що метод отримує значення IConfiguration
з Startup
класу.
Раніше я працював з DI в Azure Functions, але ще не стикався з цією конкретною вимогою.
Я використовую, 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 for IConfiguration
не є хорошою ідеєю .
Я також спробував використовувати шаблон параметрів, як описано тут і реалізований як такий:
builder.Services.AddOptions<CosmosDbClientSettings>()
.Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));
Хоча це буде працювати для введення IOptions<CosmosDbClientSettings>
в нестатичний клас, я використовую статичний клас, щоб утримати роботу з налаштуваннями.
Будь-які пропозиції щодо того, як я можу зробити цю роботу чи можливе вирішення? Я вважаю за краще зберегти всю конфігурацію в одному місці (файл завантаження).
host.json
параметри не використовуються, зокрема,routePrefix