Thông thường trong một dự án .NET Core, tôi sẽ tạo một lớp 'boostrap' để định cấu hình dịch vụ của mình cùng với các lệnh đăng ký DI. Đây thường là một phương thức mở rộng trong IServiceCollection
đó tôi có thể gọi một phương thức như thế nào .AddCosmosDbService
và mọi thứ cần thiết là 'khép kín' trong lớp tĩnh chứa phương thức đó. Điều quan trọng là phương thức này nhận được IConfiguration
từ Startup
lớp.
Tôi đã từng làm việc với DI trong Azure Chức năng trong quá khứ nhưng chưa gặp phải yêu cầu cụ thể này.
Tôi đang sử dụng IConfiguration
để liên kết với một lớp cụ thể với các cài đặt khớp với các thuộc tính từ cả local.settings.json
cài đặt ứng dụng dev / sản xuất của tôi khi Hàm được triển khai trong Azure.
CosmosDbClientSinstall.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?
}
}
Rõ ràng việc thêm một lĩnh vực riêng tư IConfiguration
vào Startup.cs
sẽ không hoạt động vì nó cần phải được phổ biến với một cái gì đó và tôi cũng đã đọc rằng sử dụng DI cho IConfiguration
không phải là một ý tưởng tốt .
Tôi cũng đã thử sử dụng mẫu tùy chọn như được mô tả ở đây và triển khai như sau:
builder.Services.AddOptions<CosmosDbClientSettings>()
.Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));
Trong khi điều này sẽ hoạt động để tiêm một IOptions<CosmosDbClientSettings>
lớp không tĩnh, tôi đang sử dụng một lớp tĩnh để giữ công việc cấu hình của tôi.
Bất kỳ đề xuất về cách tôi có thể làm cho công việc này hoặc một cách giải quyết có thể? Tôi muốn giữ tất cả cấu hình ở một nơi (tệp bootstrap).
host.json
các tham số không được sử dụng, đặc biệt,routePrefix