হ্যালো হাসিব! তুমি এখন Section 13: Environments-এর তৃতীয় লেকচার “Environment in Controller” (Lecture 145)-এ আছো।
আগের লেকচারে আমরা দেখেছিলাম কীভাবে Program.cs ফাইলে app.Environment ব্যবহার করে Environment চেক করা যায়। আজকের লেকচারে আমরা শিখবো কীভাবে Controller বা যেকোনো Service Class-এর ভেতরে Dependency Injection (DI) ব্যবহার করে বর্তমান Environment-এর নাম বা স্টেট (State) চেক করতে হয়।
চলো, এই লেকচারটি বিস্তারিতভাবে ডিকোড করি।
সারসংক্ষেপ (Quick Revision List)
- The Goal:
Program.cs-এর বাইরে (যেমন Controller বা Service-এ) Environment চেক করা। - The Service: ASP.NET Core-এ Environment চেক করার জন্য বিল্ট-ইন একটি সার্ভিস আছে, যার নাম
IWebHostEnvironment। - How to access: Controller-এর Constructor-এ
IWebHostEnvironmentইনজেক্ট করে একটিreadonlyফিল্ডে সেভ করে রাখতে হবে। - Usage: ইনজেক্ট করা সার্ভিস থেকে
IsDevelopment(),IsStaging(),EnvironmentNameইত্যাদি মেথড এবং প্রপার্টি অ্যাক্সেস করা যায়। - Update Rule:
launchSettings.json-এ Environment-এর নাম পরিবর্তন করলে, সেই পরিবর্তন দেখতে হলে অ্যাপ্লিকেশনটি (Kestrel সার্ভার) রিস্টার্ট দিতে হয়।
Comprehensive Breakdown
১. IWebHostEnvironment ইনজেক্ট করা (The Core Concept) [Priority: 10/10]
Program.cs ফাইলে app.Environment প্রপার্টিটি মূলত IWebHostEnvironment ইন্টারফেসেরই একটি ইমপ্লিমেন্টেশন। যেহেতু ASP.NET Core এই সার্ভিসটি ডিফল্টভাবেই IoC Container-এ রেজিস্টার করে রাখে, তাই আমরা চাইলেই যেকোনো Controller বা Service-এ এটি ইনজেক্ট করতে পারি।
Code Implementation (Controllers/HomeController.cs):
using Microsoft.AspNetCore.Mvc;
// ১. IWebHostEnvironment-এর জন্য এই Namespace ইমপোর্ট করতে হবে
using Microsoft.AspNetCore.Hosting;
namespace EnvironmentsExample.Controllers
{
public class HomeController : Controller
{
// ২. Private readonly field তৈরি করা
private readonly IWebHostEnvironment _webHostEnvironment;
// ৩. Constructor Injection-এর মাধ্যমে সার্ভিস রিসিভ করা
public HomeController(IWebHostEnvironment webHostEnvironment)
{
_webHostEnvironment = webHostEnvironment;
}
[Route("/")]
public IActionResult Index()
{
// ৪. বর্তমান Environment-এর নাম ViewBag-এ সেভ করা
ViewBag.CurrentEnvironment = _webHostEnvironment.EnvironmentName;
return View();
}
}
}
২. Controller-এ Environment দিয়ে লজিক লেখা (Real-world Use Case) [Priority: 9/10]
সাধারণত আমরা ভিউতে Environment-এর নাম দেখানোর জন্য এটি ব্যবহার করি না (যেমনটা লেকচারে ডেমো হিসেবে দেখানো হয়েছে)। রিয়েল-ওয়ার্ল্ড প্রোজেক্টে এটি লজিক লেখার কাজে ব্যবহৃত হয়।
উদাহরণ:
- যদি Environment “Development” হয়, তাহলে লগ (Log) ফাইলে অনেক ডিটেইলস সেভ করা।
- যদি Environment “Production” হয়, তবে পেমেন্ট গেটওয়ের (Payment Gateway) লাইভ API কল করা, আর “Development” হলে টেস্ট/স্যান্ডবক্স API কল করা।
Conceptual Implementation:
public IActionResult ProcessPayment()
{
if (_webHostEnvironment.IsDevelopment())
{
// Call Stripe Sandbox API
}
else if (_webHostEnvironment.IsProduction())
{
// Call Stripe Live API
}
return View();
}
৩. View-তে ডাটা দেখানো [Priority: 5/10]
লেকচারার ViewBag-এর ডাটাটি Index.cshtml-এ প্রিন্ট করে দেখিয়েছেন যে ইনজেকশনটি ঠিকমতো কাজ করছে কি না।
Code Implementation (Views/Home/Index.cshtml):
<div class="container">
<h2>Welcome to the Application</h2>
<div class="box">
<!-- ViewBag থেকে Environment-এর নাম প্রিন্ট করা -->
<p>Current Environment is: <strong>@ViewBag.CurrentEnvironment</strong></p>
</div>
</div>
৪. The Kestrel Restart Issue [Priority: 10/10]
লেকচারের শেষের দিকে একটি খুব ইম্পর্টেন্ট ট্রাবলশুটিং (Troubleshooting) টিপস দেওয়া হয়েছে।
লেকচারার launchSettings.json ফাইলে Environment-এর নাম “Beta” থেকে “Development” করে রান করেছিলেন, কিন্তু ব্রাউজারে তখনও “Beta” দেখাচ্ছিল।
Why did this happen?
Environment ভ্যারিয়েবলগুলো অ্যাপ্লিকেশন রান হওয়ার ঠিক শুরুতেই মেমোরিতে লোড হয়ে যায়। তুমি যদি অ্যাপ্লিকেশন চালু থাকা অবস্থায় (Running state) launchSettings.json-এ পরিবর্তন করো, তবে সেটি অটোমেটিক আপডেট হবে না।
The Fix: পরিবর্তনটি কার্যকর করার জন্য তোমাকে অবশ্যই বর্তমান রান করা কনসোল উইন্ডো (Kestrel Server) বা ভিজ্যুয়াল স্টুডিওর ডিবাগিং সেশন স্টপ করতে হবে এবং নতুন করে রান (Restart) দিতে হবে।
VS / VS Code Shortcuts
- Stop Debugging: ভিজ্যুয়াল স্টুডিও বা VS Code-এ অ্যাপ রান করা অবস্থায়
Shift + F5চাপলে সার্ভার স্টপ হয়ে যায়। আবার রান করতেF5(ডিবাগ সহ) বাCtrl + F5(ডিবাগ ছাড়া) চাপতে হয়।
Best Practices & .NET 10 Context
Best Practices for Environment in Controllers:
- Do not rely heavily on string matching: Environment চেক করার জন্য
if (env.EnvironmentName == "Development")এভাবে হার্ডকোড স্ট্রিং না লিখে, সবসময় বিল্ট-ইন মেথডIsDevelopment()বাIsProduction()ব্যবহার করবে। এতে বানান ভুলের (Typo) ঝুঁকি থাকে না। - Avoid Logic Cluttering: যদি তোমার কোডে প্রতি দুই লাইন পরপর Environment চেক করার লজিক থাকে, তবে বুঝতে হবে তোমার আর্কিটেকচারে সমস্যা আছে। এর জন্য সাধারণত ‘Configuration Pattern’ বা ‘Options Pattern’ ব্যবহার করা উচিত (যা তুমি সামনের সেকশনে শিখবে)।
.NET 10 Context:
ASP.NET Core 10-এ IWebHostEnvironment ইনজেক্ট করার কনসেপ্ট ১০০% সেম আছে। তবে .NET 10-এ তুমি চাইলে Primary Constructor ব্যবহার করে কোডটি আরও ছোট এবং ক্লিন করে লিখতে পারো।
.NET 10 Modern Code Example (Primary Constructor):
using Microsoft.AspNetCore.Mvc;
namespace EnvironmentsExample.Controllers;
// Primary Constructor: Constructor Injection is built into the class declaration
public class HomeController(IWebHostEnvironment env) : Controller
{
[Route("/")]
public IActionResult Index()
{
// Directly using the injected parameter 'env'
ViewBag.CurrentEnvironment = env.EnvironmentName;
return View();
}
}
হাসিব, Controller-এ IWebHostEnvironment ইনজেক্ট করার কনসেপ্ট কি ক্লিয়ার হয়েছে? রেডি থাকলে আমরা নেক্সট লেকচার “Environment Tag Helper”-এ মুভ করতে পারি, যেখানে আমরা শিখবো সরাসরি View ফাইলের ভেতরে কীভাবে Environment অনুযায়ী কন্টেন্ট হাইড বা শো করা যায়!