এই লেকচারের মূল উদ্দেশ্য হলো Program.cs-এর কোডকে আরও সহজ ও ক্লিন করা। এখানে শেখানো হয়েছে কীভাবে একটি Static Class এবং Static Method ব্যবহার করে IApplicationBuilder ইন্টারফেসে নতুন একটি মেথড ইনজেক্ট করা যায়, যাতে আমরা সহজেই app.UseMyCustomMiddleware() কল করতে পারি।
২. Detailed Breakdown (ধাপে ধাপে আলোচনা)
ক) Extension Method কী?
C#-এ Extension Method হলো এমন একটি পদ্ধতি যার মাধ্যমে তুমি কোনো একটি এক্সিস্টিং ক্লাস বা ইন্টারফেসের ভেতরে (যা তোমার তৈরি না, যেমন ডটনেটের নিজস্ব লাইব্রেরি) বাইরে থেকে নতুন মেথড যোগ করতে পারো।
এটি ব্যবহার করলে মনে হবে যেন মেথডটি ওই ক্লাসেরই অংশ। মিডলওয়্যারের ক্ষেত্রে আমরা এটি ব্যবহার করি যাতে app. লিখলেই আমাদের কাস্টম মেথডটি সাজেশনে আসে।
খ) Extension Method তৈরির শর্তসমূহ
১. ক্লাসটিকে অবশ্যই static হতে হবে।
২. মেথডটিকে অবশ্যই static হতে হবে।
৩. মেথডের প্রথম প্যারামিটারে this কিউওয়ার্ড থাকতে হবে।
গ) প্র্যাকটিক্যাল কোড ইমপ্লিমেন্টেশন
আমরা MyCustomMiddleware.cs ফাইলের ভেতরেই এই এক্সটেনশন ক্লাসটি তৈরি করতে পারি।
**ফাইল: MyCustomMiddleware.cs**
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace MiddlewareExample.CustomMiddleware
{
// ১. কাস্টম মিডলওয়্যার ক্লাস
public class MyCustomMiddleware : IMiddleware
{
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
await context.Response.WriteAsync("My Custom Middleware Starts...\n");
await next(context);
await context.Response.WriteAsync("My Custom Middleware Ends...\n");
}
}
// ২. এক্সটেনশন ক্লাস (অবশ্যই static হতে হবে)
public static class CustomMiddlewareExtension
{
// এই মেথডটি IApplicationBuilder-এ 'UseMyCustomMiddleware' নামে যুক্ত হবে
public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder app)
{
// আসল কাজটা এখানেই হচ্ছে
return app.UseMiddleware<MyCustomMiddleware>();
}
}
}
ঘ) Program.cs-এ ব্যবহার
এখন দেখো Program.cs কতটা পরিষ্কার হয়ে গেছে:
using MiddlewareExample.CustomMiddleware;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddTransient<MyCustomMiddleware>(); // সার্ভিস রেজিস্টার মাস্ট!
var app = builder.Build();
// মিডলওয়্যার ১
app.Use(async (context, next) => {
await context.Response.WriteAsync("Middleware 1 Starts...\n");
await next();
await context.Response.WriteAsync("Middleware 1 Ends...\n");
});
// আমাদের কাস্টম এক্সটেনশন মেথড কল করা
app.UseMyCustomMiddleware();
// মিডলওয়্যার ৩ (টার্মিনেটিং)
app.Run(async (context) => {
await context.Response.WriteAsync("Hello from Middleware 3\n");
});
app.Run();
৩. Added Context (Gaps Filled)
- IApplicationBuilder কেন?: তুমি লক্ষ্য করেছ
appঅবজেক্টটি আসলেWebApplicationটাইপের, যা আবারIApplicationBuilderথেকে ইনহেরিট করে। তাই আমরা যদিIApplicationBuilder-এ এক্সটেনশন মেথড লিখি, তবে সেটা সব জায়গায় কাজ করবে। - নেমিং কনভেনশন: মাইক্রোসফট তাদের সব বিল্ট-ইন মিডলওয়্যারের শুরুতে “Use” শব্দটা রাখে (যেমন:
UseRouting,UseStaticFiles)। তাই প্রফেশনালরা তাদের কাস্টম মিডলওয়্যারের নামওUseদিয়ে শুরু করে, যেমন:UseMyCustomMiddleware। - Method Chaining: এক্সটেনশন মেথড থেকে
return app.UseMiddleware...করার কারণ হলো যাতে আমরা চাইলে একের পর এক মেথড চেইন করতে পারি, যেমন:app.UseMyCustomMiddleware().UseAnotherMiddleware();।
৪. C# Best Practices (প্রফেশনাল টিপস)
- Shared Namespace: এক্সটেনশন ক্লাসের নেমস্পেসটি এমনভাবে রাখা ভালো যাতে
Program.cs-এ সেটা সহজেই পাওয়া যায়। অনেক সময় ডেভেলপাররা এটাকেMicrosoft.AspNetCore.Builderনেমস্পেসে রাখে যাতে আলাদা করেusingলিখতে না হয় (যদিও এটা সাবধানে করা উচিত)। - Separate Files: যদি প্রজেক্ট বড় হয়, তবে
MyCustomMiddlewareএবংCustomMiddlewareExtensionদুটি আলাদা ফাইলে রাখাই বুদ্ধিমানের কাজ। - Encapsulation: এক্সটেনশন মেথড ব্যবহারের ফলে ইউজারের জানার দরকার নেই যে ভেতরে
IMiddlewareব্যবহার হয়েছে নাকি অন্য কিছু। সে শুধু মেথড কল করবে, ব্যস!
সামারি:
- কেন করছি? কোড সহজ এবং রিডাবল (Readable) করার জন্য।
- কিভাবে করছি?
staticক্লাস এবং মেথড দিয়ে, যেখানে প্রথম প্যারামিটারthis IApplicationBuilder app। - অর্ডার: মিডলওয়্যারগুলো পাইপলাইনে যে সিরিয়ালে লিখবে, ঠিক সেই সিরিয়ালেই ১-২-৩ এবং ফিরে আসার সময় ৩-২-১ ভাবে কাজ করবে।