হ্যালো হাসিব! আমরা এখন Section 14: Configuration-এর দ্বিতীয় লেকচার “IConfiguration in Controller” (Lecture 151)-এ আছি।
আগের লেকচারে আমরা Program.cs ফাইলে Configuration রিড করা শিখেছিলাম। কিন্তু রিয়েল-ওয়ার্ল্ড প্রজেক্টে আমাদের সাধারণত Controller বা অন্যান্য Service ক্লাসগুলোর ভেতরে Configuration থেকে ডাটা (যেমন API Key, Connection String) পড়তে হয়। আজকের লেকচারে আমরা শিখবো Dependency Injection (DI) ব্যবহার করে কীভাবে Controller-এর ভেতরে IConfiguration ইনজেক্ট করতে হয়।
চলো, শুরু করি!
সারসংক্ষেপ (Quick Revision List)
- The Goal: Controller বা যেকোনো Service ক্লাসের ভেতর
appsettings.jsonবা গ্লোবাল Configuration থেকে ডাটা রিড করা। - The Service: ASP.NET Core-এ Configuration রিড করার জন্য বিল্ট-ইন একটি সার্ভিস আছে, যার নাম
IConfiguration। - How to Access: Controller-এর Constructor-এ
IConfigurationইনজেক্ট করে একটিprivate readonlyফিল্ডে সেভ করে রাখতে হবে। - Real-world Use Case: থার্ড-পার্টি REST API (যেমন: Weather API, Google API) কল করার সময় Client ID বা API Secret দরকার হয়, যা Configuration থেকে পড়ে Controller-এ ব্যবহার করা হয়।
- Reading Methods: আগের লেকচারের মতোই Indexer
_configuration["key"]অথবা_configuration.GetValue<T>("key", defaultValue)ব্যবহার করে ভ্যালু রিড করা যায়।
Comprehensive Breakdown
১. Why do we need IConfiguration in Controller? [Priority: 10/10]
লেকচারার শুরুতেই একটি রিয়েল-ওয়ার্ল্ড সিনেরিও (Real-world scenario) ব্যাখ্যা করেছেন।
ধরো, তুমি তোমার অ্যাপ্লিকেশনে OpenWeather API থেকে আবহাওয়া (Weather) ইনফরমেশন দেখাতে চাও। এই REST API কল করার জন্য তোমার একটি Client ID এবং API Key লাগবে। যেহেতু এগুলো সিক্রেট এবং গ্লোবাল ডাটা, তাই এগুলো appsettings.json ফাইলে সেভ করা থাকে।
এখন, API কল করার লজিকটি লেখা থাকে Controller-এর Action Method-এর ভেতরে। তাহলে Controller ঐ API Key পাবে কোথা থেকে?
এখানেই Dependency Injection (DI) কাজে আসে। আমরা Controller-এর ভেতরে IConfiguration ইন্টারফেসটি ইনজেক্ট করে সহজেই এই ডাটাগুলো রিড করতে পারি।
২. Controller-এ IConfiguration ইনজেক্ট করা (The Core Implementation) [Priority: 10/10]
IConfiguration সার্ভিসটি ASP.NET Core-এর IoC Container-এ ডিফল্টভাবেই রেজিস্টার করা থাকে। তাই আমাদের আলাদা করে এটি রেজিস্টার করার প্রয়োজন নেই।
Code Implementation (Controllers/HomeController.cs):
using Microsoft.AspNetCore.Mvc;
// ১. IConfiguration-এর জন্য এই Namespace ইমপোর্ট করতে হবে
using Microsoft.Extensions.Configuration;
namespace ConfigurationExample.Controllers
{
public class HomeController : Controller
{
// ২. Private readonly field তৈরি করা
private readonly IConfiguration _configuration;
// ৩. Constructor Injection-এর মাধ্যমে IConfiguration রিসিভ করা
public HomeController(IConfiguration configuration)
{
_configuration = configuration;
}
[Route("/")]
public IActionResult Index()
{
// (এখানে Configuration রিড করার কাজ হবে, যা নিচে দেখানো হলো)
return View();
}
}
}
৩. Configuration ডাটা রিড করা এবং View-তে পাঠানো [Priority: 9/10]
এখন আমরা ইনজেক্ট করা _configuration অবজেক্ট ব্যবহার করে ডাটা রিড করবো। লেকচারার এখানে দুইটি পদ্ধতি দেখিয়েছেন: একটি সাধারণ Indexer এবং অন্যটি GetValue মেথড (Default Value সহ)।
Code Implementation (HomeController এর Index মেথড):
[Route("/")]
public IActionResult Index()
{
// Method 1: Indexer ব্যবহার করে "myKey" রিড করা
// (এটি appsettings.json-এ আগে থেকেই আছে)
ViewBag.MyKey = _configuration["myKey"];
// Method 2: GetValue এবং Default Value (Fallback) ব্যবহার করা
// (appsettings.json-এ "myAPIKey" নেই, তাই এটি ডিফল্ট ভ্যালু রিটার্ন করবে)
ViewBag.MyAPIKey = _configuration.GetValue<string>("myAPIKey", "the default key");
return View();
}
৪. View-তে ডাটা দেখানো [Priority: 5/10]
Controller থেকে পাঠানো ViewBag-এর ডাটাগুলো Index.cshtml-এ সিম্পল HTML-এর মাধ্যমে প্রিন্ট করে দেখানো হয়েছে।
Code Implementation (Views/Home/Index.cshtml):
<div class="container">
<h2>Configuration Values in Controller</h2>
<div class="box">
<p><strong>MyKey Value:</strong> @ViewBag.MyKey</p>
<p><strong>MyAPIKey Value:</strong> @ViewBag.MyAPIKey</p>
</div>
</div>
(অ্যাপ রান করলে দেখা যাবে “myKey”-এর অরিজিনাল ভ্যালু প্রিন্ট হয়েছে এবং “myAPIKey” না পাওয়ায় ডিফল্ট ভ্যালু “the default key” প্রিন্ট হয়েছে)।
VS / VS Code Shortcuts (For faster development)
- Generate Constructor: Controller-এর ভেতরে
private readonly IConfiguration _configuration;লিখে ওই লাইনের উপর কার্সর রেখেCtrl + .চাপলে (বা Quick Actions মেনু ওপেন করলে) “Generate constructor” অপশন আসবে। ক্লিক করলেই অটোমেটিক Constructor তৈরি হয়ে ফিল্ডটি অ্যাসাইন হয়ে যাবে।
Best Practices & .NET 10 Context
Best Practices for IConfiguration:
- Never pass secrets to the View: লেকচারার ডেমো দেখানোর জন্য API Key-কে ViewBag দিয়ে View-তে পাঠিয়েছেন। রিয়েল-ওয়ার্ল্ড প্রজেক্টে কখনোই API Secret বা Database Password View-তে (বা Frontend-এ) পাঠাবে না। এগুলো শুধুমাত্র সার্ভার-সাইড (Controller/Service) লজিকে ব্যবহার করবে।
- Avoid injecting IConfiguration everywhere (Preview): যদি তোমার Controller-এর শুধু একটি বা দুটি স্পেসিফিক সেটিং লাগে (যেমন শুধু Email Settings), তাহলে পুরো
IConfigurationইন্টারফেসটি ইনজেক্ট করা ক্লিন আর্কিটেকচার নয়। এর বদলে Options Pattern ব্যবহার করা বেস্ট প্র্যাকটিস (যা তুমি এই সেকশনের সামনের লেকচারগুলোতেই শিখবে)।
.NET 10 Context (Primary Constructors): ভিডিওতে C#-এর ক্লাসিক Constructor Injection দেখানো হয়েছে। কিন্তু আধুনিক .NET 8, 9 বা 10-এ (C# 12+ ফিচারে) Primary Constructors ব্যবহার করে এই কাজটিকে আরও অনেক বেশি শর্ট এবং ক্লিন করে লেখা যায়।
.NET 10 Modern Code Example:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
namespace ConfigurationExample.Controllers;
// .NET 10 Style: Constructor Injection 클래스 선언부에 바로 작성 (Primary Constructor)
// এতে আলাদা করে private readonly field বা আলাদা Constructor লেখার কোনো দরকার নেই!
public class HomeController(IConfiguration configuration) : Controller
{
[Route("/")]
public IActionResult Index()
{
// Parameter 'configuration'-কে সরাসরি Field-এর মতো ব্যবহার করা যাচ্ছে
string apiKey = configuration.GetValue<string>("WeatherAPI:Key", "default_key");
// (Do something with the API key, like calling external service)
return View();
}
}
হাসিব, Controller-এ IConfiguration ইনজেক্ট করার এই কনসেপ্টটি কি তোমার কাছে ক্লিয়ার হয়েছে? রেডি থাকলে আমরা নেক্সট লেকচার “Hierarchical Configuration”-এ মুভ করতে পারি, যেখানে আমরা শিখবো Nested JSON অবজেক্ট (যেমন MasterKey:ChildKey) থেকে ডাটা কীভাবে রিড করতে হয়!