হ্যালো হাসিব! তুমি এখন Section 12: Dependency Injection-এর দশম লেকচার “AddTransient(), AddScoped(), AddSingleton()” (Lecture 137)-এ আছো।

আগের লেকচারগুলোতে আমরা IoC Container-এ সার্ভিস রেজিস্টার করার জন্য new ServiceDescriptor(...) ব্যবহার করে বিশাল লম্বা কোড লিখেছিলাম। আজকের লেকচারে আমরা শিখবো কীভাবে সেই একই কাজ ASP.NET Core-এর Shorthand Methods বা এক্সটেনশন মেথড ব্যবহার করে খুব সহজে এক লাইনে করা যায়।

চলো, এই ছোট্ট কিন্তু খুবই দরকারি লেকচারটি ডিকোড করি।


সারসংক্ষেপ (Quick Revision List)

  • The Problem: builder.Services.Add(new ServiceDescriptor(typeof(IInterface), typeof(Class), ServiceLifetime.Scoped)) লেখাটা অনেক লম্বা এবং ক্লিন কোড নয়।
  • The Solution: ASP.NET Core-এ IServiceCollection-এর জন্য ৩টি Shorthand (Extension) মেথড আছে:
  1. AddTransient<TInterface, TImplementation>()
  2. AddScoped<TInterface, TImplementation>()
  3. AddSingleton<TInterface, TImplementation>()
  • How to use: জেনেরিক প্যারামিটারের (Angle brackets < >) ভেতরে প্রথমে ইন্টারফেসের নাম এবং পরে ক্লাসের নাম দিতে হয়। শেষে ফাস্ট ব্র্যাকেট () দিয়ে মেথডটি কল করতে হয়।

Comprehensive Breakdown

১. The Old Lengthy Way (আগের পদ্ধতি) [Priority: 3/10]

আগে আমরা Program.cs ফাইলে সার্ভিস রেজিস্টার করার জন্য নিচের মতো কোড লিখতাম:

// The Old Way (Long and complex)
builder.Services.Add(new ServiceDescriptor(
    typeof(ICitiesService), 
    typeof(CitiesService), 
    ServiceLifetime.Transient
));
 

এটি ব্যাকএন্ডে কীভাবে কাজ করে তা বোঝার জন্য ভালো, কিন্তু রিয়েল-ওয়ার্ল্ড প্রজেক্টে কেউ এভাবে কোড লেখে না।

২. The Modern Shorthand Methods (শর্টকাট পদ্ধতি) [Priority: 10/10]

ASP.NET Core আমাদের জন্য তিনটি জেনেরিক (Generic) মেথড দিয়ে দিয়েছে। জেনেরিক মেথড মানে হলো, মেথডের নামের পর < > এর ভেতরে টাইপ বলে দেওয়া যায়, ফলে typeof() ব্যবহার করার ঝামেলা থাকে না।

Code Implementation (Program.cs):

১. Transient Service এর জন্য:

// Creates a new instance every time it is requested.
builder.Services.AddTransient<ICitiesService, CitiesService>();
 

২. Scoped Service এর জন্য:

// Creates a new instance once per HTTP request.
builder.Services.AddScoped<ICitiesService, CitiesService>();
 

৩. Singleton Service এর জন্য:

// Creates a single instance for the entire application lifetime.
builder.Services.AddSingleton<ICitiesService, CitiesService>();
 

Syntax Rule:

  • প্রথম প্যারামিটার: Interface (যেমন: ICitiesService)
  • দ্বিতীয় প্যারামিটার: Class (যেমন: CitiesService)
  • শেষে ফাস্ট ব্র্যাকেট: (); (এটি ভুললে কম্পাইল এরর খাবে)।

৩. Execution Flow [Priority: 8/10]

তুমি যখন AddScoped<ICitiesService, CitiesService>() কল করো, তখন ব্যাকএন্ডে ASP.NET Core ঠিক আগের লেকচারের মতোই একটি ServiceDescriptor অবজেক্ট তৈরি করে তার IoC Container-এর লিস্টে অ্যাড করে নেয়।

অর্থাৎ, আগের কোড এবং বর্তমান কোডের কার্যকারিতায় (Functionality) বিন্দুমাত্র পার্থক্য নেই। এটি শুধুমাত্র একটি Syntactic Sugar (কোড সুন্দর করে লেখার উপায়)।


VS / VS Code Shortcuts (For faster development)

  • Comment/Uncomment: কোনো লাইন সিলেক্ট করে Ctrl + / (বা Ctrl + K, Ctrl + C / Ctrl + K, Ctrl + U) চাপলে তা কমেন্ট বা আনকমেন্ট হয়ে যায়।

Best Practices & .NET 10 Context

Best Practices for Registering Services:

  1. Always use Shorthand Methods: প্রজেক্টে কখনোই new ServiceDescriptor() ব্যবহার করবে না। সবসময় AddTransient, AddScoped, বা AddSingleton ব্যবহার করবে।
  2. Grouping Registrations: যখন প্রোজেক্টে অনেক সার্ভিস হয়ে যায়, তখন সেগুলোকে আলাদা আলাদা এক্সটেনশন মেথডে গ্রুপ করে রাখা বেস্ট প্র্যাকটিস (যেমন: services.AddDatabaseServices(), services.AddBusinessServices())।

.NET 10 Context: ASP.NET Core 10-এ এই Shorthand মেথডগুলোই ডিফল্ট এবং একমাত্র স্ট্যান্ডার্ড। .NET 10-এর Minimal API বা MVC— যেকোনো আর্কিটেকচারেই এই মেথডগুলো একইভাবে ব্যবহৃত হয়।

// .NET 10 Program.cs Example
var builder = WebApplication.CreateBuilder(args);
 
// Registering services cleanly
builder.Services.AddScoped<ICitiesService, CitiesService>();
builder.Services.AddTransient<IEmailSender, EmailSender>();
builder.Services.AddSingleton<ICacheManager, MemoryCacheManager>();
 
var app = builder.Build();
 

হাসিব, এটি ছিল একটি শর্ট এবং সিম্পল লেকচার। তুমি রেডি থাকলে আমরা নেক্সট লেকচার “View Injection”-এ মুভ করতে পারি, যেখানে আমরা শিখবো Controller ছাড়া কীভাবে সরাসরি View (.cshtml) ফাইলে সার্ভিস ইনজেক্ট করতে হয়!