হ্যালো হাসিব! আমরা এখন কোর্সের সম্পূর্ণ নতুন এবং অত্যন্ত প্রয়োজনীয় একটি সেকশন Section 14: Configuration শুরু করতে যাচ্ছি। এটি এই সেকশনের প্রথম ইন্ট্রোডাক্টরি লেকচার “Configuration Basics” (Lecture 150)

যেকোনো প্রফেশনাল প্রোজেক্টে ডাটাবেস কানেকশন বা থার্ড-পার্টি API নিয়ে কাজ করার জন্য Configuration সিস্টেম বোঝা একদম বাধ্যতামূলক। চলো, এই লেকচারটি ডিকোড করি।


সারসংক্ষেপ (Quick Revision List)

  • Configuration কী: এটি হলো ASP.NET Core-এর একটি সিস্টেম, যেখানে গ্লোবাল Key-Value pair আকারে ডাটা স্টোর করে রাখা যায় এবং পুরো অ্যাপ্লিকেশনের যেকোনো জায়গা থেকে তা রিড করা যায়।
  • কেন ব্যবহার করবো: Connection Strings, API Keys (Client ID/Secret), গ্লোবাল ইমেইল অ্যাড্রেস বা যেকোনো কনস্ট্যান্ট ভ্যালু সেভ করে রাখার জন্য।
  • Primary Source: ASP.NET Core-এ Configuration স্টোর করার সবচেয়ে ডিফল্ট জায়গা হলো appsettings.json ফাইল।
  • Reading Method 1 (Indexer): app.Configuration["myKey"] ব্যবহার করে ভ্যালু রিড করা যায়। এটি Case-insensitive এবং সবসময় string রিটার্ন করে।
  • Reading Method 2 (GetValue): app.Configuration.GetValue<T>("myKey") ব্যবহার করে Type-safe উপায়ে ভ্যালু রিড করা যায়।
  • Default Value (Fallback): GetValue<int>("x", 10) - এর মানে হলো যদি “x” নামে কোনো Key না পাওয়া যায়, তবে অ্যাপ ক্র্যাশ না করে ডিফল্ট ভ্যালু 10 রিটার্ন করবে।

Comprehensive Breakdown

১. Configuration কী এবং কেন দরকার? [Priority: 10/10]

রিয়েল-ওয়ার্ল্ড প্রোজেক্টে এমন অনেক ডাটা থাকে যা Controller, View বা Middleware-এর বিভিন্ন জায়গায় বারবার দরকার হয়।

  • উদাহরণ: ডাটাবেসের Connection String, Google বা OpenWeatherMap-এর মতো থার্ড-পার্টি সার্ভারের API Key, Client ID বা Client Secret।
  • The Problem: তুমি যদি এই ডাটাগুলো কোডের ভেতরে হার্ডকোড (Hardcode) করে রাখো, তবে ভবিষ্যতে ডাটা চেঞ্জ করতে হলে পুরো কোডবেস খুঁজে খুঁজে চেঞ্জ করতে হবে এবং আবার কম্পাইল করতে হবে।
  • The Solution: এই ডাটাগুলো আমরা একটি নির্দিষ্ট জায়গায় সেভ করে রাখবো, যাকে বলা হয় Configuration Settings। একবার সেট করবো, আর পুরো অ্যাপ্লিকেশন জুড়ে রিইউজ (Reuse) করবো।

২. appsettings.json এ ডাটা সেভ করা [Priority: 9/10]

ASP.NET Core প্রোজেক্ট তৈরি করলে ডিফল্টভাবে appsettings.json নামের একটি ফাইল তৈরি হয়। এটি একটি সিম্পল JSON ফাইল, যা Configuration-এর অন্যতম প্রধান ডাটা সোর্স।

Code Implementation (appsettings.json):

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  // আমাদের কাস্টম Key-Value যোগ করা হলো
  "myKey": "myValue from appsettings.json",
  "x": 1
}
 

৩. Program.cs থেকে Configuration রিড করা (Indexer Syntax) [Priority: 10/10]

Program.cs ফাইলে IApplicationBuilder (যাকে আমরা app নামে চিনি)-এর ভেতরে Configuration নামে একটি বিল্ট-ইন প্রপার্টি থাকে। এর মাধ্যমে আমরা ডাটা রিড করতে পারি।

Code Implementation (Program.cs - Method 1):

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
 
app.MapGet("/", () => 
{
    // Indexer ব্যবহার করে ভ্যালু রিড করা হচ্ছে
    // এটি Case-insensitive, অর্থাৎ "myKey" বা "MYKEY" লিখলেও কাজ করবে।
    string value = app.Configuration["myKey"]; 
    
    return value;
});
 
app.Run();
 

৪. GetValue<T>() এবং Default Value ব্যবহার করা [Priority: 10/10]

উপরের Indexer পদ্ধতিতে একটি সমস্যা হলো, এটি সবসময় string রিটার্ন করে। তোমার যদি Integer বা Boolean ডাটা লাগে, তবে তোমাকে ম্যানুয়ালি Typecast করতে হবে। এই ঝামেলা এড়াতে GetValue<T> মেথডটি ব্যবহার করা হয়।

Code Implementation (Program.cs - Method 2 & 3):

app.MapGet("/", () => 
{
    // Method 2: Type-safe রিডিং। সরাসরি string হিসেবে ডাটা আসবে।
    string strValue = app.Configuration.GetValue<string>("myKey");
    
    // Method 3: Default Value বা Fallback Value সেট করা।
    // যদি appsettings.json-এ "x" না থাকে, তবে সে এরর না দিয়ে ডিফল্ট হিসেবে 10 রিটার্ন করবে।
    int intValue = app.Configuration.GetValue<int>("x", 10);
    
    return $"String: {strValue} \n Integer: {intValue}";
});
 

৫. অন্যান্য Configuration Sources (ভবিষ্যতের টপিক) [Priority: 7/10]

যদিও appsettings.json সবচেয়ে পপুলার, তবে ASP.NET Core আরও অনেক সোর্স থেকে Configuration রিড করতে পারে। যেমন:

  • Environment Variables
  • XML বা INI ফাইল
  • In-memory Dictionary
  • Secret Manager (খুবই ইম্পর্টেন্ট, যা আমরা সামনে শিখবো)

VS / VS Code Shortcuts (For faster development)

  • Format JSON: appsettings.json ফাইলে কাজ করার সময় কোড এলোমেলো হয়ে গেলে Shift + Alt + F চাপলে সুন্দর করে ফরম্যাট হয়ে যাবে।

Best Practices & .NET 10 Context

Best Practices for Configuration:

  1. Do not store sensitive secrets in appsettings.json: ডাটাবেসের প্রোডাকশন পাসওয়ার্ড, পেমেন্ট গেটওয়ের API Secret— এগুলো কখনোই appsettings.json ফাইলে সেভ করবে না। কারণ এই ফাইলটি গিটহাবে (GitHub) পুশ হলে হ্যাকাররা সহজেই তোমার সিক্রেট পেয়ে যাবে। এর জন্য Secret Manager বা Azure Key Vault ব্যবহার করতে হয় (যা আমরা সামনে শিখবো)।
  2. Use Hierarchical Data: JSON-এ ডাটা রাখার সময় Flat স্ট্রাকচারের বদলে হায়ারার্কিক্যাল (Nested Object) স্টাইলে ডাটা রাখা ভালো। (যেমন "Stripe": { "ApiKey": "..." })। এটি নেক্সট লেকচারেই আসবে।

.NET 10 Context: ASP.NET Core 10-এ Minimal API এবং Top-level Statements ব্যবহার করে Configuration রিড করার মেকানিজম .NET 6 এর মতোই হুবহু এক।

তবে একটি গুরুত্বপূর্ণ পার্থক্য হলো:

  • builder.Build() কল করার আগে যদি Configuration দরকার হয়, তবে builder.Configuration ব্যবহার করতে হয়।
  • builder.Build() কল করার পরে (Middleware বা Endpoints-এ) app.Configuration ব্যবহার করতে হয়।

.NET 10 Modern Code Example:

var builder = WebApplication.CreateBuilder(args);
 
// Build করার আগে Configuration রিড করা (যেমন ডাটাবেস কানেকশন সেটআপের জন্য)
string dbConnectionString = builder.Configuration.GetValue<string>("DbConnection");
 
var app = builder.Build();
 
// Build করার পরে Endpoints-এ Configuration রিড করা
app.MapGet("/config", () => 
{
    int fallbackValue = app.Configuration.GetValue<int>("MaxItems", 50);
    return Results.Ok($"Max items allowed: {fallbackValue}");
});
 
app.Run();
 

হাসিব, Configuration-এর এই বেসিক কনসেপ্ট কি ক্লিয়ার হয়েছে? রেডি থাকলে আমরা নেক্সট লেকচার “IConfiguration in Controller”-এ মুভ করতে পারি, যেখানে আমরা শিখবো Dependency Injection ব্যবহার করে কীভাবে Controller থেকে এই ডাটা রিড করতে হয়!