आम तौर पर एक .NET कोर प्रोजेक्ट में मैं DI पंजीकरण आदेशों के साथ अपनी सेवा को कॉन्फ़िगर करने के लिए एक 'बूस्टरैप' वर्ग बनाऊंगा। यह आमतौर पर एक विस्तार विधि है IServiceCollection
जहां मैं एक विधि को कॉल कर सकता हूं जैसे कि .AddCosmosDbService
और आवश्यक सभी चीजें स्थिर वर्ग में 'स्व-निहित' हैं। कुंजी हालांकि इस विधि का एक हो जाता है है IConfiguration
से Startup
वर्ग।
मैंने अतीत में Azure Functions में DI के साथ काम किया है, लेकिन अभी तक इस विशिष्ट आवश्यकता के पार नहीं आया हूं।
जब मैं फंक्शन अज़ुरे में तैनात किया जाता है, तो 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
काम नहीं के रूप में यह कुछ के साथ आबादी होने की जरूरत है और मैं भी पढ़ा है कि होगा के लिए डि का उपयोग कर IConfiguration
एक अच्छा विचार नहीं है ।
मैंने भी वर्णित के रूप में विकल्प पैटर्न का उपयोग करने की कोशिश की है यहाँ है और इस तरह लागू किया गया है:
builder.Services.AddOptions<CosmosDbClientSettings>()
.Configure<IConfiguration>((settings, configuration) => configuration.Bind(settings));
हालांकि यह IOptions<CosmosDbClientSettings>
एक गैर-स्थिर वर्ग को इंजेक्ट करने के लिए काम करेगा , मैं अपने कॉन्फ़िगरेशन कार्य को होल्ड करने के लिए एक स्थिर वर्ग का उपयोग कर रहा हूं।
मैं इस काम या संभावित वर्कअराउंड कैसे बना सकता हूं, इस पर कोई सुझाव? मैं सभी कॉन्फ़िगरेशन को एक स्थान पर रखना चाहता हूं (बूटस्ट्रैप फ़ाइल)।
host.json
मापदंडों का उपयोग नहीं किया जाता है, विशेष रूप से,routePrefix