일반적으로 .NET Core 프로젝트에서는 DI 등록 명령과 함께 서비스를 구성하는 'boostrap'클래스를 만듭니다. 이것은 일반적으로 같은 메소드를 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
에서 Startup.cs
하지 않습니다 일이 무엇인가로 채워해야하고 나는 또한 읽었다로 에 대한 DI를 사용하는 것은 IConfiguration
좋은 생각되지 않습니다 .
또한 여기에 설명 된 옵션 패턴을 사용해 보았고 다음 과 같이 구현했습니다.
builder.Services.AddOptions<CosmosDbClientSettings>()
.Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));
이것은 IOptions<CosmosDbClientSettings>
정적이 아닌 클래스 에 주입하는 데 효과적이지만 정적 클래스를 사용하여 구성 작업을 유지하고 있습니다.
이 작업을 수행하는 방법 또는 가능한 해결 방법에 대한 제안 사항이 있습니까? 모든 구성을 한 곳에 보관하고 싶습니다 (부트 스트랩 파일).
host.json
사용하면 특히 매개 변수가 사용되지 않는 문제가 있습니다 .routePrefix