স্বাগতম! আপনার কোর্সের Section 20 (Filters)-এর “Service Filter” (লেকচার ৩০১) টপিকে আমরা চলে এসেছি।

এতদিন আমরা Action Method বা Controller-এর উপর ফিল্টার বসানোর জন্য [TypeFilter] ব্যবহার করে আসছিলাম। কিন্তু ASP.NET Core-এ আরও একটি অ্যাট্রিবিউট আছে যার নাম [ServiceFilter]। এই লেকচারে আমরা জানব TypeFilter এবং ServiceFilter-এর মধ্যে মূল পার্থক্য কী, কখন কোনটি ব্যবহার করবেন এবং ইন্টারভিউয়ের জন্য কোন বিষয়গুলো মনে রাখা জরুরি। চলুন শুরু করি!


📝 Quick Revision Summary

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

ফিচার/বৈশিষ্ট্য[TypeFilter][ServiceFilter]
Arguments (প্যারামিটার পাস করা)হ্যাঁ, Arguments প্রপার্টির মাধ্যমে কাস্টম আর্গুমেন্ট পাঠানো যায়।না, কাস্টম আর্গুমেন্ট পাঠানো যায় না।
Dependency Injection (অন্য সার্ভিস ইনজেক্ট করা)হ্যাঁ, কনস্ট্রাক্টরে অন্য সার্ভিস ইনজেক্ট করা যায়।হ্যাঁ, কনস্ট্রাক্টরে অন্য সার্ভিস ইনজেক্ট করা যায়।
IoC Container-এ রেজিস্ট্রেশন (Program.cs)প্রয়োজন নেই। ফ্রেমওয়ার্ক নিজে থেকেই ObjectFactory দিয়ে অবজেক্ট বানায়।বাধ্যতামূলক! builder.Services.AddTransient<MyFilter>() লিখতে হবে।
Object Lifetime (অবজেক্টের আয়ু)বাই-ডিফল্ট Transient (প্রতিবার নতুন অবজেক্ট তৈরি হয়)।আপনার ইচ্ছামতো (AddTransient, AddScoped, AddSingleton) সেট করা যায়।

🔍 Comprehensive Breakdown

১. The Core Difference (Arguments) [Priority: 10/10]

The “Why”: TypeFilter এবং ServiceFilter দুটির উদ্দেশ্যই এক— কোনো একটি ক্লাসকে ফিল্টার হিসেবে অ্যাপ্লাই করা। কিন্তু মূল পার্থক্যটা শুরু হয় যখন আপনার ফিল্টার ক্লাসে কাস্টম প্যারামিটার (যেমন key, value) দরকার হয়।

  • Type Filter: আপনি যদি কনস্ট্রাক্টরে কাস্টম ভ্যালু পাস করতে চান, তবে আপনাকে অবশ্যই TypeFilter ব্যবহার করতে হবে।
[TypeFilter(typeof(ResponseHeaderActionFilter), Arguments = new object[] { "Key", "Value" })]
 
  • Service Filter: ഇതിতে Arguments নামের কোনো প্রপার্টি নেই! তাই আপনার ফিল্টারে যদি কোনো কাস্টম প্যারামিটার থাকে, তবে ServiceFilter ব্যবহার করা যাবে না।

২. Dependency Injection & IoC Registration [Priority: 10/10]

এই অংশটি ইন্টারভিউয়ের জন্য খুব জনপ্রিয় একটি প্রশ্ন!

Service Filter-এর কাজ করার ধরন: ServiceFilter ফিল্টারের অবজেক্ট নিজে তৈরি করে না। সে সরাসরি Dependency Injection (IoC) কন্টেইনারের কাছে ফিল্টারটি চায়। তাই, আপনি যদি Program.cs-এ ফিল্টারটি রেজিস্টার না করেই [ServiceFilter(typeof(PersonsListActionFilter))] লেখেন, তবে অ্যাপ্লিকেশনটি HTTP 500 (InvalidOperationException) থ্রো করবে এবং বলবে “No service for type… has been registered.”

সমাধান: ServiceFilter ব্যবহার করতে হলে Program.cs-এ অবশ্যই ফিল্টারটিকে সার্ভিস হিসেবে অ্যাড করতে হবে।

// In Program.cs
builder.Services.AddTransient<PersonsListActionFilter>();
 

Type Filter-এর কাজ করার ধরন: অন্যদিকে, TypeFilter IoC কন্টেইনারের উপর পুরোপুরি নির্ভরশীল নয়। এটি ObjectFactory ব্যবহার করে রানটাইমে নিজেই ফিল্টারের অবজেক্ট new কিওয়ার্ড দিয়ে তৈরি করে নেয়। তবে কনস্ট্রাক্টরে যদি কোনো সার্ভিস (যেমন ILogger) থাকে, সেটি সে ঠিকই IoC থেকে নিয়ে আসে। তাই TypeFilter ব্যবহার করলে Program.cs-এ ফিল্টার ক্লাসটিকে রেজিস্টার করার কোনো প্রয়োজন নেই।

৩. Object Lifetime (Transient, Scoped, Singleton) [Priority: 8/10]

  • TypeFilter: এটি বাই-ডিফল্ট Transient হিসেবে কাজ করে। অর্থাৎ, যতবার ফিল্টারটি ফায়ার হবে, ততবার মেমরিতে এর একটি নতুন অবজেক্ট তৈরি হবে। (যদিও এতে IsReusable = true নামে একটি প্রপার্টি আছে, কিন্তু মাইক্রোসফট ডকস অনুযায়ী এর উপর সম্পূর্ণ নির্ভর না করাই ভালো)।
  • ServiceFilter: যেহেতু আপনি একে Program.cs-এ রেজিস্টার করছেন, তাই এর লাইফটাইমের সম্পূর্ণ কন্ট্রোল আপনার হাতে! আপনি চাইলে এটিকে AddScoped (প্রতি রিকোয়েস্টে একবার অবজেক্ট তৈরি হবে) বা AddSingleton (পুরো অ্যাপ্লিকেশনের জন্য একবার অবজেক্ট তৈরি হবে) হিসেবে রেজিস্টার করতে পারেন।

💡 Warning: যদি আপনি ফিল্টারকে Singleton হিসেবে রেজিস্টার করেন, তবে ওই ফিল্টারের কনস্ট্রাক্টরে কখনোই কোনো Transient বা Scoped সার্ভিস (যেমন DbContext) ইনজেক্ট করবেন না। এটি “Captive Dependency” নামক একটি সিরিয়াস মেমরি লিক বা বাগ তৈরি করে!

৪. Common Features [Priority: 8/10]

উভয়ের মধ্যেই বেশ কিছু মিল আছে:

  1. DI Support: দুটিতেই আপনি ILogger বা অন্য যেকোনো সার্ভিস কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করতে পারবেন।
  2. Filter Types: দুটিতেই আপনি Action, Result, Resource, Authorization বা Exception Filter অ্যাপ্লাই করতে পারবেন।

🚀 Best Practices & .NET Modern Updates

Best Practices for Developers:

  1. Consistency: লেকচারার যেমনটি বলেছেন, এই দুটির মধ্যে আহামরি কোনো পারফরম্যান্স পার্থক্য নেই। যদি আপনার কাস্টম আর্গুমেন্ট না লাগে, তবে পুরো প্রজেক্টে যেকোনো একটি স্ট্যান্ডার্ড মেনে চলা ভালো (হয় শুধু TypeFilter, অথবা শুধু ServiceFilter)। তবে TypeFilter একটু বেশি ফ্লেক্সিবল হওয়ায় এর ব্যবহার বেশি দেখা যায়।

.NET 10 & The Modern Approach (IFilterFactory): আগামী লেকচারগুলোতে আপনি হয়তো IFilterFactory নিয়ে বিস্তারিত জানবেন। আধুনিক .NET-এ বারবার [TypeFilter(typeof(MyFilter))] না লিখে আমরা সরাসরি একটি Custom Attribute তৈরি করি (যেমন [ResponseHeader("Key", "Value")]), যা ব্যাকগ্রাউন্ডে IFilterFactory ব্যবহার করে ফিল্টারের অবজেক্ট বানায়। এটি দেখতে অনেক বেশি ক্লিন এবং প্রোডাকশন-রেডি!

আজকের লেকচারটি কি আপনার কাছে ক্লিয়ার হয়েছে? পরবর্তী লেকচার “Filter Attribute Classes”-এর জন্য প্রস্তুত হলে জানাবেন!