হ্যালো হাসিব! তুমি এখন 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) মেথড আছে:
AddTransient<TInterface, TImplementation>()AddScoped<TInterface, TImplementation>()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:
- Always use Shorthand Methods: প্রজেক্টে কখনোই
new ServiceDescriptor()ব্যবহার করবে না। সবসময়AddTransient,AddScoped, বাAddSingletonব্যবহার করবে। - 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) ফাইলে সার্ভিস ইনজেক্ট করতে হয়!