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 IServiceCollectionböyle bir yöntemi çağırabileceğim bir uzatma yöntemidir .AddCosmosDbServiceve 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 IConfigurationgelen Startupsı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 IConfigurationhem benim local.settings.jsonhem 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 IConfigurationde Startup.csolmaz işler o şey ile doldurulması gerekir ve ben de okumuştum olarak için DI kullanarak IConfigurationiyi 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