Biasanya dalam proyek .NET Core saya akan membuat kelas 'boostrap' untuk mengkonfigurasi layanan saya bersama dengan perintah pendaftaran DI. Ini biasanya merupakan metode ekstensi di IServiceCollection
mana saya dapat memanggil metode seperti .AddCosmosDbService
dan semua yang diperlukan adalah 'mandiri' di kelas statis yang berisi metode itu. Kuncinya adalah bahwa metode ini mendapat IConfiguration
dari Startup
kelas.
Saya telah bekerja dengan DI di Fungsi Azure di masa lalu tetapi belum menemukan persyaratan khusus ini.
Saya menggunakan IConfiguration
untuk mengikat ke kelas yang konkret dengan pengaturan properti yang cocok dari kedua saya local.settings.json
serta pengaturan aplikasi dev / produksi ketika Fungsi dikerahkan di 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?
}
}
Jelas menambahkan bidang pribadi untuk IConfiguration
di Startup.cs
tidak akan berfungsi karena perlu diisi dengan sesuatu dan saya juga membaca bahwa menggunakan DI untuk IConfiguration
bukan ide yang baik .
Saya juga telah mencoba menggunakan pola opsi seperti yang dijelaskan di sini dan diimplementasikan sebagai berikut:
builder.Services.AddOptions<CosmosDbClientSettings>()
.Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));
Meskipun ini akan berfungsi untuk menyuntikkan IOptions<CosmosDbClientSettings>
ke kelas non-statis, saya menggunakan kelas statis untuk menahan pekerjaan konfigurasi saya.
Ada saran tentang bagaimana saya bisa membuat ini berfungsi atau solusi yang mungkin? Saya lebih suka menyimpan semua konfigurasi di satu tempat (file bootstrap).
host.json
parameter tidak digunakan, khususnya,routePrefix