通常、.NET Coreプロジェクトでは、DI登録コマンドとともにサービスを構成するための「ブーストラップ」クラスを作成します。これは通常、メソッドをIServiceCollection
呼び出すことができる拡張メソッドであり、.AddCosmosDbService
必要なものはすべて、そのメソッドを含む静的クラスで「自己完結型」です。重要なのは、メソッドがクラスIConfiguration
からを取得することStartup
です。
私は過去にAzure FunctionsでDIを使用したことがありますが、この特定の要件にはまだ遭遇していません。
関数をAzureにデプロイするときに、IConfiguration
私local.settings.json
と開発/プロダクションアプリケーションの両方の設定に一致するプロパティを持つ具体的なクラスにバインドするためにを使用しています。
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
ことは、何かを入力する必要があるため機能しIConfiguration
ません。また、DIを使用することはお勧めしません。
ここで説明されているようにオプションパターンを使用してみて、そのように実装しました。
builder.Services.AddOptions<CosmosDbClientSettings>()
.Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));
これはIOptions<CosmosDbClientSettings>
非静的クラスに挿入するために機能しますが、私は静的クラスを使用して構成作業を保持しています。
これを機能させる方法または可能な回避策について何か提案はありますか?すべての構成を1か所(ブートストラップファイル)に保持したいと思います。
host.json
は、特にパラメーターが使用されないという問題がありますroutePrefix