সাধারণত। নেট কোর প্রকল্পে আমি ডিআই রেজিস্ট্রেশন কমান্ডের সাথে আমার পরিষেবা কনফিগার করতে একটি 'বুস্টারপ' শ্রেণি তৈরি করতাম। এটি সাধারণত IServiceCollection
আমি যেখানে কোনও পদ্ধতির মতো কল করতে পারি তার একটি এক্সটেনশন পদ্ধতি .AddCosmosDbService
এবং প্রয়োজনীয় পদ্ধতিটি সেই পদ্ধতিটি সহ স্ট্যাটিক শ্রেণিতে 'স্ব-অন্তর্ভুক্ত'। যদিও মূল বিষয়টি হল ক্লাস IConfiguration
থেকে একটি পদ্ধতি পায় Startup
।
আমি অতীতে অ্যাজুরে ফাংশনগুলিতে ডিআইয়ের সাথে কাজ করেছি কিন্তু এখনও এই নির্দিষ্ট প্রয়োজনীয়তাটি পূরণ করতে পারি নি।
আমি যখন কাজটি অ্যাজুরেতে স্থাপন করা হয় তখন 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