হ্যালো হাসিব! তুমি এখন 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:

  1. Strict Rule: View Injection ব্যবহার করে কখনোই বিজনেস লজিক বা ডাটাবেস অপারেশন (যেমন DbContext) চালাবে না! এটি MVC আর্কিটেকচার প্যাটার্নের সম্পূর্ণ বিরোধী। View-এর কাজ শুধু ডাটা প্রেজেন্ট করা।
  2. When to use: শুধুমাত্র UI-রিলেটেড সার্ভিস (যেমন: IStringLocalizer for translations, IConfiguration for 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”-এ মুভ করতে পারি!