স্বাগতম! আজ আমরা শিখতে যাচ্ছি ASP.NET Core-এর একটি অত্যন্ত গুরুত্বপূর্ণ কোর কনসেপ্ট—Filters। আপনার কোর্স Outline অনুযায়ী, আমরা এখন Section 20-এ (Introduction to Filters) আছি। এর আগে আমরা Middleware নিয়ে শিখেছি যা রিকোয়েস্ট পাইপলাইনে কাজ করে। আজ আমরা দেখব, রিকোয়েস্ট যখন MVC বা Web API-এর কোনো নির্দিষ্ট অ্যাকশনে পৌঁছায়, তখন সেই অ্যাকশন এক্সিকিউট হওয়ার ঠিক আগে বা পরে আমরা কীভাবে কন্ট্রোল নিতে পারি। চলুন শুরু করা যাক!

📝 Quick Revision Summary

ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য পুরো লেকচারের মূল পয়েন্টগুলো নিচে দেওয়া হলো:

  • Filters কী: এগুলো এমন কিছু মেথড যা Action method এক্সিকিউট হওয়ার ঠিক আগে এবং পরে রান করে।
  • Pipeline Flow: Request -> Middleware -> Routing Middleware -> MVC Action Selector -> Filter Pipeline -> Action Method।
  • ৫ ধরনের Filters: 1. Authorization Filters
  1. Resource Filters
  2. Action Filters
  3. Exception Filters
  4. Result Filters
  • Execution Behavior: কিছু ফিল্টার অ্যাকশনের আগে ও পরে দু’বারই কাজ করে (যেমন Action, Resource), আবার কিছু ফিল্টার নির্দিষ্ট সময়ে একবারই কাজ করে (যেমন Authorization, Exception)।
  • কেন ব্যবহার করব: Cross-cutting concerns যেমন— Authorization, Model validation, Caching, এবং Request/Response header ম্যানিপুলেশন হ্যান্ডেল করার জন্য।

🔍 Comprehensive Breakdown

Introduction to Filters [Priority: 10/10]

Filters হলো ASP.NET Core MVC-এর এমন একটি মেকানিজম যা আপনাকে Action method-এর এক্সিকিউশনের আগে বা পরে কাস্টম কোড রান করার সুবিধা দেয়।

The “Why”: কেন আমাদের ফিল্টার প্রয়োজন? ধরুন, আপনার অ্যাপ্লিকেশনে ১০০টি API এন্ডপয়েন্ট আছে এবং আপনি চান প্রত্যেকটি এন্ডপয়েন্টে রিকোয়েস্ট আসার সময় একটি লগ (log) তৈরি হোক বা ইনপুট ডেটা ভ্যালিডেট হোক। প্রত্যেকটি অ্যাকশন মেথডের ভেতর বারবার একই কোড (Code duplication) লেখার বদলে, আপনি একটি ফিল্টার তৈরি করে সেটি অ্যাপ্লাই করে দিতে পারেন। এতে কোড অনেক ক্লিন এবং মেইনটেইনেবল হয়।

How Filters Fit into the Pipeline [Priority: 9/10]

লেকচারার স্পষ্ট করেছেন যে, ফিল্টার এবং মিডলওয়্যার এক জিনিস নয়।

  • প্রথমে Request Pipeline কাজ করে, যেখানে সমস্ত Middleware (যেমন— Routing, Authentication) একে একে রান করে।
  • যখন Routing middleware একটি ইনকামিং URL-এর সাথে রুট ম্যাচ করে (যেমন: /home/index), তখন এটি রিকোয়েস্টটিকে MVC subsystem-এ পাঠিয়ে দেয়।
  • এরপর Action Selector ঠিক করে কোন অ্যাকশন মেথডটি কল হবে।
  • ঠিক এই মুহূর্তে, অ্যাকশন মেথড রান করার আগে Filter Pipeline এক্সিকিউট হওয়া শুরু করে।

Types of Filters and Their Execution [Priority: 10/10]

ASP.NET Core-এ মূলত ৫ ধরনের ফিল্টার আছে। নিচে তাদের কাজের ধরন এবং কোড ইমপ্লিমেন্টেশনের উদাহরণ দেওয়া হলো:

১. Authorization Filters: সবার আগে এটি এক্সিকিউট হয়। ইউজার এই অ্যাকশনটি অ্যাক্সেস করার অনুমতি (permission) রাখে কি না, তা চেক করাই এর কাজ।

  • Method: এতে শুধু একটি মেথড থাকে— OnAuthorization()
public class CustomAuthFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // Authorization logic goes here
    }
}
 

২. Resource Filters: Authorization-এর পরেই এটি রান করে। এটি সাধারণত Caching বা মডেল বাইন্ডিং হওয়ার আগেই রিকোয়েস্ট শর্ট-সার্কিট করার কাজে ব্যবহৃত হয়।

  • Methods: OnResourceExecuting() (আগে) এবং OnResourceExecuted() (পরে)।

৩. Action Filters: এটি অ্যাকশন মেথড কল হওয়ার ঠিক আগে এবং পরে রান করে। Action method parameters ম্যানিপুলেট করা বা Model State validate করার জন্য এটি সবচেয়ে বেশি ব্যবহৃত হয়। পরবর্তী লেকচারে এটি নিয়ে বিস্তারিত আলোচনা হবে।

  • Methods: OnActionExecuting() (আগে) এবং OnActionExecuted() (পরে)।
public class CustomActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // Executes BEFORE the action method
    }
 
    public void OnActionExecuted(ActionExecutedContext context)
    {
        // Executes AFTER the action method
    }
}
 

৪. Exception Filters: অ্যাকশন মেথড বা ফিল্টার পাইপলাইনে কোনো আনহ্যান্ডেলড এরর (unhandled exception) ঘটলে এই ফিল্টারটি ট্রিগার হয়।

  • Method: এতে শুধু একটি মেথড থাকে— OnException()

৫. Result Filters: অ্যাকশন মেথড থেকে যখন কোনো Result (যেমন View, JSON) রিটার্ন হয়, তখন সেটি ক্লায়েন্টের কাছে পাঠানোর ঠিক আগে ও পরে এটি কাজ করে।

  • Methods: OnResultExecuting() (Result এক্সিকিউশনের আগে) এবং OnResultExecuted() (Result এক্সিকিউশনের পরে)।

🚀 Best Practices & Modern .NET Updates

Best Practices for Filters:

  1. Single Responsibility: একটি ফিল্টারে শুধুমাত্র একটি নির্দিষ্ট কাজ (যেমন শুধু লগিং বা শুধু ভ্যালিডেশন) করুন। অনেক কাজ একসাথে মিলিয়ে ফেলবেন না।
  2. Avoid Business Logic: ফিল্টারের ভেতরে কখনোই অ্যাপ্লিকেশনের কোর বিজনেস লজিক লিখবেন না। ফিল্টার শুধুমাত্র Request/Response প্রসেসিংয়ের জন্য ব্যবহার করা উচিত।
  3. Use Dependency Injection: ফিল্টারে কোনো সার্ভিস প্রয়োজন হলে TypeFilter বা ServiceFilter ব্যবহার করে Dependency Injection নিশ্চিত করুন।

.NET 10 & Minimal APIs Context (Updated Approach): ট্রান্সক্রিপ্টে যে ফিল্টারগুলোর কথা বলা হয়েছে, সেগুলো ট্র্যাডিশনাল MVC এবং Controller-based Web API এর জন্য প্রযোজ্য। কিন্তু বর্তমানে .NET 10-এ Minimal APIs এর ব্যবহার অনেক জনপ্রিয় (যা আপনার কোর্সের Section 30-এ আছে)। Minimal API-তে IActionFilter বা IResourceFilter কাজ করে না। এর পরিবর্তে আরও আপডেটেড এবং লাইটওয়েট Endpoint Filters (IEndpointFilter) ব্যবহার করা হয়।

Minimal API Endpoint Filter Example (.NET 10 Style):

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
 
app.MapGet("/api/data", () => "Hello World!")
   .AddEndpointFilter(async (invocationContext, next) =>
   {
       // Executes BEFORE the endpoint logic (Like OnActionExecuting)
       Console.WriteLine("Before execution...");
       
       var result = await next(invocationContext); // Call the actual endpoint
       
       // Executes AFTER the endpoint logic (Like OnActionExecuted)
       Console.WriteLine("After execution...");
       
       return result;
   });
 
app.Run();
 

এই নতুন এপ্রোচটি পারফরম্যান্সের দিক থেকে অনেক ফাস্ট এবং আধুনিক মাইক্রোসার্ভিস আর্কিটেকচারে বহুল ব্যবহৃত।