হ্যালো হাসিব! তুমি এখন Section 12: Dependency Injection-এর ষষ্ঠ লেকচার “Method Injection - FromService” (Lecture 133)-এ আছো।
আগের লেকচারে আমরা Constructor Injection শিখেছিলাম, যেখানে পুরো Controller-এর জন্য Service রিসিভ করা হতো। এই লেকচারে আমরা শিখবো কিভাবে পুরো ক্লাসের বদলে শুধুমাত্র একটি নির্দিষ্ট Action Method-এ Service ইনজেক্ট করা যায়, যাকে Method Injection বলা হয়।
চলো, লেকচারটি বিস্তারিতভাবে ডিকোড করি।
সারসংক্ষেপ (Quick Revision List)
- Method Injection কী: Controller-এর Constructor-এ Service ইনজেক্ট না করে, সরাসরি একটি নির্দিষ্ট Action Method-এর প্যারামিটারে Service ইনজেক্ট করার প্রক্রিয়া।
- কেন ব্যবহার করবো: যখন কোনো Service পুরো Controller-এর সব মেথডে প্রয়োজন হয় না, শুধুমাত্র একটি নির্দিষ্ট মেথডেই দরকার হয়, তখন অযথাই Constructor-এ ইনজেক্ট করে মেমোরি খরচ না করে Method Injection ব্যবহার করা হয়।
- কীভাবে কাজ করে: Action Method-এর প্যারামিটারে
[FromServices]Attribute ব্যবহার করতে হয়। IoC Container এই Attribute দেখে বুঝতে পারে যে তাকে এখানে একটি Service অবজেক্ট দিতে হবে। - Recommendation: প্রজেক্টে Constructor Injection সবচেয়ে বেশি (Standard) ব্যবহৃত হয়। Method Injection খুব রেয়ার (Rare) কেসে ব্যবহৃত হয়।
Comprehensive Breakdown
১. The Concept: Method Injection কেন দরকার? [Priority: 8/10]
আগের কোডে আমরা HomeController-এর Constructor-এ ICitiesService ইনজেক্ট করেছিলাম।
এর মানে হলো, HomeController-এর ভেতরে যদি ১০টি Action Method থাকে (যেমন: Index, About, Contact, Privacy ইত্যাদি), যে মেথডেই রিকোয়েস্ট আসুক না কেন, প্রতিবার Controller তৈরি হওয়ার সময় CitiesService এর একটি অবজেক্ট তৈরি হবেই।
কিন্তু ধরো, তোমার CitiesService শুধুমাত্র Index মেথডেই দরকার। বাকি ৯টি মেথডে এর কোনো কাজ নেই। তাহলে অন্য মেথড কল করার সময় অযথাই এই Service তৈরি করাটা সার্ভারের জন্য একটি এক্সট্রা লোড (Overhead)। এই সমস্যার সমাধানই হলো Method Injection।
২. Method Injection ইমপ্লিমেন্ট করা (Implementation) [Priority: 10/10]
Method Injection করার জন্য Constructor থেকে Injection-এর কোড মুছে ফেলতে হবে এবং সরাসরি Action Method-এর প্যারামিটারে সেটি রিসিভ করতে হবে।
এখানে 매জিক (Magic) Attribute হলো [FromServices]। এটি IoC Container-কে নির্দেশ দেয় যে এই প্যারামিটারের ডাটা ইউজার বা রিকোয়েস্ট বডি থেকে আসবে না, এটি আসবে DI Container থেকে।
Code Implementation (Controllers/HomeController.cs):
using Microsoft.AspNetCore.Mvc;
using ServiceContracts;
namespace DIExample.Controllers
{
public class HomeController : Controller
{
// Constructor Injection এর অংশটুকু কমেন্ট করে দেওয়া হলো
/*
private readonly ICitiesService _citiesService;
public HomeController(ICitiesService citiesService)
{
_citiesService = citiesService;
}
*/
// ডিফল্ট প্যারামিটারলেস কনস্ট্রাক্টর
public HomeController()
{
}
[Route("/")]
// Action Method-এর প্যারামিটারে Method Injection করা হচ্ছে
public IActionResult Index([FromServices] ICitiesService _citiesService)
{
// সরাসরি প্যারামিটার থেকে সার্ভিস ব্যবহার করা হচ্ছে
List<string> cities = _citiesService.GetCities();
return View(cities);
}
[Route("/about")]
public IActionResult About()
{
// এই মেথডে CitiesService-এর অবজেক্ট তৈরি হবে না। মেমোরি বাঁচবে!
return View();
}
}
}
৩. Execution Flow (পর্দার আড়ালে কী হচ্ছে?) [Priority: 9/10]
লেকচারার ব্রেকপয়েন্ট দিয়ে দেখিয়েছেন:
- ইউজার যখন
/(Index) রাউটে রিকোয়েস্ট করে, তখনHomeController-এর ডিফল্ট কনস্ট্রাক্টর এক্সিকিউট হয়। (তখনো কোনো সার্ভিস তৈরি হয়নি)। - এরপর যখন
Indexমেথড কল হওয়ার সময় আসে, তখন ফ্রেমওয়ার্ক প্যারামিটারে[FromServices]Attribute-টি দেখে। - ফ্রেমওয়ার্ক তখন IoC Container-এর কাছে
ICitiesServiceচায়। - Container একটি
CitiesServiceঅবজেক্ট বানিয়ে ঐ মেথডের প্যারামিটারে পাস করে দেয়। - মেথডটি এক্সিকিউট হয়ে ডাটা ভিউতে চলে যায়।
৪. Constructor Injection vs Method Injection (কোনটি বেস্ট?) [Priority: 10/10]
লেকচারার শেষে খুব সুন্দর একটি রিয়েল-লাইফ অ্যাডভাইস দিয়েছেন:
- Constructor Injection: এটি সবচেয়ে Formal এবং Common। কারণ, আজকে হয়তো সার্ভিসটি শুধু একটি মেথডে লাগছে, কিন্তু ভবিষ্যতে অন্য মেথডেও লাগতে পারে। তাই Constructor-এ দিয়ে রাখাটাই সেফ এবং স্ট্যান্ডার্ড।
- Method Injection: এটি খুবই Rare। শুধুমাত্র তখনই ব্যবহার করবে যখন তোমার Controller অনেক বিশাল এবং তুমি ১০০% শিওর যে এই সার্ভিসটি এই একটি মেথড ছাড়া আর কোথাও জীবনেও লাগবে না, এবং সার্ভিসটি তৈরি হতে মেমোরি অনেক বেশি লাগে।
VS / VS Code Shortcuts
- Comment Block: একাধিক লাইন সিলেক্ট করে
Ctrl + Kচেপে ধরে রেখেCtrl + Cচাপলে কোড কমেন্ট হয়ে যায়। আনকমেন্ট করতেCtrl + KতারপরCtrl + U।
Best Practices & .NET 10 Context
Best Practices for Method Injection:
- Prefer Primary Constructors (.NET 12+): প্রফেশনাল প্রজেক্টে সবসময় Constructor Injection ই প্রেফার করবে। Method Injection শুধুমাত্র পারফরম্যান্স অপটিমাইজেশনের জন্য এক্সট্রিম কেসে ব্যবহার করা উচিত।
- Attribute Usage:
[FromServices]Attribute দেওয়াটা কোডের Readability বাড়ায়, অন্য ডেভেলপার দেখলে সহজেই বুঝতে পারে এই ডাটা কোথা থেকে আসছে।
.NET 10 Context (The Magic of Implicit DI):
ASP.NET Core 7 থেকে শুরু করে মডার্ন .NET 10-এ ফ্রেমওয়ার্ক এতটাই স্মার্ট হয়ে গেছে যে, Action Method-এর প্যারামিটারে অনেক সময় [FromServices] লেখাও লাগে না!
যদি তোমার ইন্টারফেসটি (ICitiesService) আগে থেকেই Program.cs-এ IoC Container-এ রেজিস্টার করা থাকে, তবে .NET 10 নিজে থেকেই বুঝে নেয় যে এটি DI Container থেকে দিতে হবে (একে Implicit Service Resolution বলে)।
.NET 10 Modern Code Example:
[Route("/")]
// .NET 10-এ [FromServices] না লিখলেও IoC Container অটোমেটিক অবজেক্ট ইনজেক্ট করে দেবে!
public IActionResult Index(ICitiesService _citiesService)
{
var cities = _citiesService.GetCities();
return View(cities);
}
(তবে [FromServices] লিখে দেওয়াটা ক্লিন কোড প্র্যাকটিস, কারণ এতে কোনো কনফিউশন থাকে না)।
হাসিব, Method Injection-এর কনসেপ্ট কি ক্লিয়ার হয়েছে? তুমি রেডি থাকলে আমরা নেক্সট লেকচার “Transient, Scoped, Singleton”-এ মুভ করতে পারি, যা Dependency Injection-এর সবচেয়ে বেশি জিজ্ঞাসিত ইন্টারভিউ টপিক!