โดยปกติในโครงการ. NET Core ฉันจะสร้างคลาส 'boostrap' เพื่อกำหนดค่าบริการของฉันพร้อมกับคำสั่งการลงทะเบียน DI นี่เป็นวิธีส่วนขยายIServiceCollection
ที่ฉันสามารถเรียกวิธีการที่ชอบ.AddCosmosDbService
และทุกสิ่งที่จำเป็นคือ 'อยู่ในตัวเอง' ในคลาสแบบสแตติกที่มีวิธีการนั้น กุญแจสำคัญคือว่าวิธีการได้รับIConfiguration
จากStartup
ชั้นเรียน
ฉันเคยทำงานกับ DI ในฟังก์ชั่น Azure ในอดีต แต่ยังไม่ผ่านข้อกำหนดเฉพาะนี้
ฉันใช้IConfiguration
เพื่อผูกกับคลาสที่เป็นรูปธรรมพร้อมการตั้งค่าการจับคู่คุณสมบัติจากทั้งของฉันlocal.settings.json
และการตั้งค่าแอปพลิเคชัน dev / การผลิตเมื่อฟังก์ชั่นการใช้งานใน 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?
}
}
เห็นได้ชัดว่าการเพิ่มข้อมูลส่วนตัวIConfiguration
ในStartup.cs
จะไม่ทำงานตามความต้องการที่จะมีประชากรที่มีบางสิ่งบางอย่างและฉันได้อ่านว่าใช้ DI สำหรับIConfiguration
ไม่ได้เป็นความคิดที่ดี
ฉันได้ลองใช้รูปแบบตัวเลือกตามที่อธิบายไว้ที่นี่และนำไปใช้เช่น:
builder.Services.AddOptions<CosmosDbClientSettings>()
.Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));
ขณะนี้จะทำงานเพื่อฉีดIOptions<CosmosDbClientSettings>
คลาสที่ไม่คงที่ฉันใช้คลาสแบบคงที่เพื่อระงับการกำหนดค่าของฉัน
ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีที่ฉันสามารถทำงานนี้หรือวิธีแก้ปัญหาที่เป็นไปได้? ฉันต้องการเก็บการกำหนดค่าทั้งหมดไว้ในที่เดียว (ไฟล์ bootstrap)
host.json
ไม่ได้ใช้พารามิเตอร์โดยเฉพาะroutePrefix