Normalde bir .NET Core projesinde, hizmetimi DI kayıt komutlarıyla birlikte yapılandırmak için bir 'boostrap' sınıfı oluştururdum. Bu genellikle IServiceCollection
böyle bir yöntemi çağırabileceğim bir uzatma yöntemidir .AddCosmosDbService
ve gereken her şey bu yöntemi içeren statik sınıfta 'kendi kendine yeten' dir. Anahtar rağmen yöntem alır olduğunu IConfiguration
gelen Startup
sınıfı.
Geçmişte Azure İşlevleri'nde DI ile çalıştım ancak henüz bu özel gereksinimle karşılaşmadım.
İşlev Azure'da dağıtıldığında IConfiguration
hem benim local.settings.json
hem de dev / üretim uygulama ayarlarından eşleşen özelliklerle somut bir sınıfa bağlanmak için kullanıyorum .
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?
}
}
İçin Açıkçası özel alan ekleyerek IConfiguration
de Startup.cs
olmaz işler o şey ile doldurulması gerekir ve ben de okumuştum olarak için DI kullanarak IConfiguration
iyi bir fikir değildir .
Ben de burada açıklandığı gibi seçenekler desen kullanarak denedim ve böyle uygulanır:
builder.Services.AddOptions<CosmosDbClientSettings>()
.Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));
Bu IOptions<CosmosDbClientSettings>
statik olmayan bir sınıfa enjekte etmek için çalışırken, yapılandırma çalışmalarımı tutmak için statik bir sınıf kullanıyorum.
Bu işi veya olası bir çözümü nasıl yapabileceğime dair herhangi bir öneriniz var mı? Tüm yapılandırmayı tek bir yerde (bootstrap dosyası) tutmayı tercih ederim.
host.json
özellikle parametrelerin kullanılmadığı bir sorunum varroutePrefix