স্বাগতম! আজ আমরা এই কোর্সের অন্যতম গুরুত্বপূর্ণ একটি ইন্টারভিউ টপিক নিয়ে আলোচনা করব: Filters vs Middleware। Course Outline অনুযায়ী আমরা এখন Section 20 (Filters)-এর একেবারে শেষ পর্যায়ে (লেকচার ৩০৪) আছি।
এতদিন আমরা Middleware এবং Filters নিয়ে আলাদাভাবে কাজ করেছি এবং দেখেছি দুটিই রিকোয়েস্টের আগে-পরে লজিক এক্সিকিউট করে। তাহলে এদের মধ্যে আসল পার্থক্য কী? কখন কোনটি ব্যবহার করা উচিত? আজ আমরা এই ধোঁয়াশা পুরোপুরি ক্লিয়ার করব! চলুন শুরু করি।
📝 Quick Revision Summary
ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য মূল পার্থক্যগুলো নিচে দেওয়া হলো:
- The Pipeline: Middleware হলো পুরো অ্যাপ্লিকেশনের Request Pipeline-এর অংশ, আর Filters হলো শুধুমাত্র Endpoint Middleware-এর ভেতরের একটি অংশ (Filter Pipeline)।
- Set Theory: Middleware হলো Superset (বড় পরিধি), আর Filters হলো Subset (ছোট পরিধি)।
- Execution Scope: Middleware সাধারণত অ্যাপ্লিকেশনের সব রিকোয়েস্টের জন্য কাজ করে (এমনকি ইমেজ বা স্ট্যাটিক ফাইলের জন্যও)। অন্যদিকে Filters শুধুমাত্র নির্দিষ্ট Controller বা Action Method-এর জন্য কাজ করে।
- Access to Context: Middleware সাধারণত
HttpContextনিয়ে কাজ করে। আর Filters সরাসরি MVC-specific ডেটা (যেমন:Action Arguments,ViewData,ModelState) অ্যাক্সেস করতে পারে। - Use Cases (Middleware): Global লেভেলের কাজ— যেমন HTTPS Redirection, Global Exception Handling, CORS বা Performance Profiling।
- Use Cases (Filters): MVC-specific কাজ— যেমন স্পেসিফিক কোনো প্যারামিটার ভ্যালিডেট করা, View Result শর্ট-সার্কিট করা বা Action-এর রেসপন্স মডিফাই করা।
🔍 Comprehensive Breakdown
১. The Architecture (Pipeline এর ভেতরে Pipeline) [Priority: 10/10]
The “Why”: ইন্টারভিউতে প্রায়ই पूछा যায় যে, “উভয়ই তো রিকোয়েস্ট প্রসেস করে, তাহলে এদের মধ্যে বেসিক আর্কিটেকচারাল পার্থক্য কী?”
ব্রাউজার থেকে যখন কোনো রিকোয়েস্ট Kestrel সার্ভারে আসে, তখন সেটি Request Pipeline-এ প্রবেশ করে। এই পাইপলাইনে অনেকগুলো Middleware চেইন করা থাকে। রিকোয়েস্ট যখন Routing Middleware-এ আসে, তখন ফ্রেমওয়ার্ক ঠিক করে যে কোন Action Method-টি কল করতে হবে। এরপর রিকোয়েস্টটি যখন Endpoint Middleware-এ পৌঁছায়, ঠিক সেই মুহূর্তে Action Method এক্সিকিউট হওয়ার ঠিক আগে Filter Pipeline এক্সিকিউট হওয়া শুরু করে।
সহজ কথায়: Filter Pipeline কোনো স্বাধীন পাইপলাইন নয়, এটি Endpoint Middleware-এর ভেতরের একটি অংশ মাত্র!
২. Scope and Context (কার ক্ষমতা কতটুকু?) [Priority: 10/10]
- Middleware (Application Level): এটি পুরো অ্যাপ্লিকেশনের গেটওয়ে। ইউজারের রিকোয়েস্টটি কোনো API-এর জন্য এসেছে, নাকি কোনো স্ট্যাটিক ফাইলের (যেমন CSS/JS) জন্য এসেছে, তা চেক করার আগেই Middleware কাজ শুরু করে দেয়।
- Filters (MVC/Route Specific): এটি শুধুমাত্র MVC বা Web API আর্কিটেকচারের জন্য ডিজাইন করা। একটি ফিল্টার খুব সহজেই জানে যে রিকোয়েস্টে আসা প্যারামিটারের নাম কী, কোন View রিটার্ন হবে, বা Model State ভ্যালিড কি না। Middleware-এর পক্ষে এই MVC-specific ডেটাগুলো রিড করা অনেক কঠিন বা অসম্ভব।
৩. Code Implementation: The Contrast [Priority: 9/10]
কখন কোথায় কোনটি লিখবেন, তার একটি ক্লিয়ার উদাহরণ নিচে দেওয়া হলো:
Middleware Example (Program.cs): এটি সব রিকোয়েস্টের জন্য কাজ করবে।
var app = builder.Build();
// Custom Middleware (Runs for EVERY single request)
app.Use(async (context, next) =>
{
Console.WriteLine("Middleware: Processing Request...");
await next();
});
app.MapControllers();
app.Run();
Filter Example (PersonsController.cs):
এটি শুধু নির্দিষ্ট Action-এর জন্য কাজ করবে।
using Microsoft.AspNetCore.Mvc;
public class PersonsController : Controller
{
// Custom Filter (Runs ONLY when this specific Index action is called)
[TypeFilter(typeof(ResponseHeaderActionFilter))]
public IActionResult Index()
{
return View();
}
}
🚀 Best Practices & .NET 10 Modern Context
Best Practices:
- Never use Filters for Global Application Policies: CORS (Cross-Origin Resource Sharing), Authentication মেকানিজম বা Global Error Handling-এর মতো কাজগুলো সবসময় Middleware দিয়ে করবেন। এগুলো Filter দিয়ে করাটা Anti-pattern।
- Use Filters for Business/Controller Logic: যদি আপনার লজিকটি নির্দিষ্ট কোনো Controller-এর Model Data, ViewData বা Action Result-এর উপর নির্ভর করে, তবে চোখ বন্ধ করে Filter ব্যবহার করুন।
.NET 10 & Minimal APIs Update:
.NET 10-এ যদি আপনি Minimal APIs নিয়ে কাজ করেন, তবে সেখানে Controller থাকে না, তাই সনাতন MVC Filters (যেমন IActionFilter) সেখানে কাজ করে না।
Minimal API-তে এই দুটির পার্থক্য আরও পরিষ্কার করার জন্য Endpoint Filters (AddEndpointFilter) ব্যবহার করা হয়।
Minimal API Example (.NET 10):
// Middleware (Global)
app.Use(async (context, next) => { /* Runs for everything */ await next(); });
// Endpoint Filter (Specific to this route, acts like an Action Filter)
app.MapGet("/api/data", () => "Hello World")
.AddEndpointFilter(async (context, next) =>
{
/* Runs ONLY for /api/data */
return await next(context);
});
আশা করি Middleware এবং Filters-এর মধ্যে কনসেপচুয়াল এবং প্র্যাকটিক্যাল পার্থক্যটি আপনার কাছে একদম পানির মতো পরিষ্কার হয়ে গেছে! ফিল্টার সেকশনটি আমরা সফলভাবে শেষ করলাম। আপনি প্রস্তুত হলে আমরা পরবর্তী সেকশনের দিকে এগিয়ে যেতে পারি।