হ্যালো হাসিব! তুমি এখন Section 12: Dependency Injection-এর একাদশ লেকচার “View Injection” (Lecture 138)-এ আছো।
এতক্ষণ আমরা শিখেছি কীভাবে Controller বা অন্য কোনো Service-এর ভেতরে Dependency Injection করতে হয়। আজকের লেকচারে আমরা শিখবো কীভাবে সরাসরি একটি View (.cshtml) ফাইলের ভেতরে Service ইনজেক্ট করতে হয়।
চলো, এই লেকচারটি বিস্তারিতভাবে ডিকোড করি।
সারসংক্ষেপ (Quick Revision List)
- View Injection কী: Controller-এর মাধ্যমে ডাটা না পাঠিয়ে, সরাসরি Razor View (
.cshtml) ফাইলে Dependency Injection ব্যবহার করে কোনো Service-এর অবজেক্ট রিসিভ করার পদ্ধতি। - কীভাবে কাজ করে: View ফাইলগুলো রানটাইমে কম্পাইল হয়ে C# ক্লাস (
RazorPage) তৈরি হয়। যেহেতু এগুলো ক্লাস, তাই এগুলোতেও Service ইনজেক্ট করা সম্ভব। - Syntax: View ফাইলের শুরুতে
@inject InterfaceName VariableNameলিখতে হয়। - কখন ব্যবহার করবো: যখন এমন কোনো Service দরকার যা Controller থেকে Model হিসেবে পাঠানো হয়নি বা পাঠানোর প্রয়োজন নেই (যেমন:
IConfiguration, Localization/Translation সার্ভিস, বা UI-specific কোনো ড্রপডাউন ডাটা)। - Scope Sharing: Controller এবং View একই Request Scope-এর আন্ডারে রান করে। তাই Service যদি
Scopedহয়, তবে Controller এবং View উভয়েই একই Service Instance (একই GUID) পাবে।
Comprehensive Breakdown
১. View কীভাবে কাজ করে? (Views as Classes) [Priority: 6/10]
লেকচারার শুরুতেই একটি গুরুত্বপূর্ণ ব্যাকএন্ড মেকানিজম ক্লিয়ার করেছেন। তুমি যখন .cshtml ফাইলে HTML এবং C# কোড লেখো, ASP.NET Core রানটাইমে সেটিকে কম্পাইল করে একটি C# ক্লাস তৈরি করে, যা RazorPage নামক একটি প্রিডিফাইনড বেস ক্লাস থেকে ইনহেরিট করে।
যেহেতু View দিনশেষে একটি C# ক্লাসই হয়, তাই Controller-এর মতো View-তেও অনায়াসে Service ইনজেক্ট করা যায়।
২. View Injection-এর প্রয়োজনীয়তা (Why?) [Priority: 9/10]
সাধারণত MVC আর্কিটেকচারে ডাটাবেসের সব ডাটা Controller রিসিভ করে এবং Model হিসেবে View-তে পাঠায়। তাহলে View-তে সরাসরি Service ইনজেক্ট করার দরকার কী?
The Why: মাঝে মাঝে View-তে এমন কিছু ডাটা বা লজিক দরকার হয়, যা Controller-এর বিজনেস লজিকের অংশ নয়। যেমন:
- Configuration: তোমার
appsettings.jsonথেকে কোনো ভ্যালু (যেমন: API Base URL বা Company Name) সরাসরি View-তে দেখাতে হবে। এর জন্য Controller-কে কষ্ট দেওয়ার কোনো মানে হয় না। - Localization/Translation: মাল্টি-ল্যাঙ্গুয়েজ সাইটে টেক্সট ট্রান্সলেট করার জন্য View-তে সরাসরি Translation Service ইনজেক্ট করা হয়।
- Common UI Elements: লেআউট ফাইলে বা মেনুতে কিছু ডাটা দেখানোর জন্য।
৩. Step-by-Step ইমপ্লিমেন্টেশন [Priority: 10/10]
এখন আমরা দেখবো কীভাবে আমাদের ICitiesService কে সরাসরি Index.cshtml-এ ইনজেক্ট করতে হয়।
Step A: Namespace Import করা
যেহেতু আমরা ICitiesService ব্যবহার করবো, তাই এর Namespace-টি _ViewImports.cshtml ফাইলে ইমপোর্ট করে নিতে হবে, যাতে সব View এটি চিনতে পারে।
<!-- Views/_ViewImports.cshtml -->
@using ServiceContracts
Step B: @inject ডিরেক্টিভ ব্যবহার করা
Index.cshtml-এর একদম উপরে @inject ডিরেক্টিভ ব্যবহার করে Service-কে ইনজেক্ট করতে হবে।
- প্রথম অংশ: ইন্টারফেসের নাম (
ICitiesService) - দ্বিতীয় অংশ: তুমি যে ভ্যারিয়েবলের নামে এটি রিসিভ করতে চাও (
citiesServiceInView)
Code Implementation (Views/Home/Index.cshtml):
<!-- ১. Service Inject করা হচ্ছে -->
@inject ICitiesService citiesServiceInView
<div class="box">
<!-- ২. ইনজেক্ট করা সার্ভিস থেকে ডাটা কল করা হচ্ছে -->
@{
List<string> cities = citiesServiceInView.GetCities();
}
<h2>Cities List from View Injection</h2>
<ul>
<!-- ৩. সেই ডাটা দিয়ে লুপ চালানো হচ্ছে -->
@foreach (var city in cities)
{
<li>@city</li>
}
</ul>
</div>
৪. Scope Sharing (Controller এবং View-এর মাঝে) [Priority: 8/10]
আগের লেকচারে আমরা GUID দিয়ে লাইফটাইম চেক করেছিলাম। লেকচারার এখানেও সেই GUID প্রিন্ট করে একটি চমৎকার জিনিস প্রমাণ করেছেন।
Code Implementation:
<h3>Service ID in View: @citiesServiceInView.ServiceInstanceId</h3>
What happens here?
যদি তোমার Service-টি Scoped হিসেবে রেজিস্টার করা থাকে (AddScoped), তাহলে Controller-এর কনস্ট্রাক্টরে ইনজেক্ট হওয়া সার্ভিস এবং View-তে ইনজেক্ট হওয়া সার্ভিসের GUID হুবহু এক হবে!
কারণ Controller এবং View দুজনেই একই ব্রাউজার রিকোয়েস্টের (Request Scope) অংশ। IoC Container বোঝে যে রিকোয়েস্ট এখনো শেষ হয়নি, তাই সে View-কেও ঐ একই অবজেক্ট দেয়।
VS / VS Code Shortcuts (For faster development)
- Razor Comment: Razor ফাইলে (
.cshtml) HTML বা C# কোড কমেন্ট করার জন্য লাইন সিলেক্ট করেCtrl + /(বাCtrl + K, Ctrl + C) চাপলে অটোমেটিক্যালি@* ... *@স্টাইলে রেজর কমেন্ট তৈরি হয়ে যাবে।
Best Practices & .NET 10 Context
Best Practices for View Injection:
- Strict Rule: View Injection ব্যবহার করে কখনোই বিজনেস লজিক বা ডাটাবেস অপারেশন (যেমন
DbContext) চালাবে না! এটি MVC আর্কিটেকচার প্যাটার্নের সম্পূর্ণ বিরোধী। View-এর কাজ শুধু ডাটা প্রেজেন্ট করা। - When to use: শুধুমাত্র UI-রিলেটেড সার্ভিস (যেমন:
IStringLocalizerfor translations,IConfigurationfor app settings, বা Dropdown list-এর জন্য ছোট কোনো Lookup Service) ইনজেক্ট করার জন্য এটি ব্যবহার করবে। ডাটা ম্যানিপুলেশনের জন্য সবসময় Controller ব্যবহার করবে।
.NET 10 Context:
ASP.NET Core 10-এ View Injection-এর মেকানিজম এবং @inject সিনট্যাক্স সম্পূর্ণ অপরিবর্তিত আছে। মডার্ন .NET 10 প্রজেক্টে View Injection-এর সবচেয়ে ক্লাসিক এবং রিয়েল-ওয়ার্ল্ড উদাহরণ হলো IConfiguration ইনজেক্ট করা:
.NET 10 Modern Code Example:
<!-- appsettings.json থেকে ডাটা সরাসরি View-তে পড়া -->
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
<footer>
<p>Company Name: @Configuration["CompanySettings:Name"]</p>
<p>Support Email: @Configuration["CompanySettings:SupportEmail"]</p>
</footer>
হাসিব, View Injection-এর এই কনসেপ্ট কি ক্লিয়ার হয়েছে? তুমি রেডি থাকলে আমরা এই সেকশনের সবচেয়ে গুরুত্বপূর্ণ লেকচারগুলোর একটি “Best Practices for DI”-এ মুভ করতে পারি!