১. ControllerBase বনাম Controller (ইনহেরিট্যান্স)
এই ক্লাসগুলো ইনহেরিট করলে তুমি অনেকগুলো বিল্ট-ইন মেথড এবং প্রপার্টি একদম হাতের নাগালে পেয়ে যাও।
- ControllerBase: এটা মূলত Web API তৈরির জন্য।
- উপকারিতা: এটা ইনহেরিট করলে তুমি Ok(), NotFound(), BadRequest() এর মতো হেল্পার মেথডগুলো সরাসরি ব্যবহার করতে পারবে। এছাড়া ইউজারের রিকোয়েস্ট থেকে ডেটা পড়ার জন্য Request, Response, User প্রপার্টিগুলোর অ্যাক্সেস পাবে।
- না লিখলে কী হতো? তোমাকে ম্যানুয়ালি HttpContext কল করে রেসপন্স কোড (যেমন: 200 বা 404) সেট করতে হতো, যা বেশ ঝামেলার।
- Controller: এটা মূলত MVC (Model-View-Controller) প্রজেক্টের জন্য। মজার ব্যাপার হলো, এই ক্লাসটা কিন্তু ControllerBase থেকেই ইনহেরিট করা।
- উপকারিতা: ControllerBase-এর সব সুবিধার পাশাপাশি এতে HTML ওয়েব পেজ (View) রেন্ডার করার মেথড থাকে। যেমন: View(), PartialView(), ViewBag, ViewData ইত্যাদি।
- কখন কোনটা? শুধু ডেটা (JSON/XML) আদান-প্রদান করলে ControllerBase নিবে। আর ব্রাউজারে দেখানোর জন্য HTML পেজ রিটার্ন করতে চাইলে Controller নিবে।
২. [Controller] বনাম [ApiController] (অ্যাট্রিবিউট)
এগুলো ক্লাসের ওপর বসিয়ে দিলে .NET-এর রাউটিং এবং চেকিং মেকানিজম বেশ কিছু সিদ্ধান্ত অটোমেটিক নিয়ে নেয়।
- [Controller]: * .NET সাধারণত ক্লাসের নামের শেষে “Controller” লেখা থাকলে (যেমন: MyController) অটোমেটিক সেটাকে কন্ট্রোলার হিসেবে চিনে নেয়।
- উপকারিতা: যদি তুমি ক্লাসের নামের শেষে “Controller” শব্দটা না রাখতে চাও (যেমন ক্লাসের নাম দিলে শুধু ShopApi), তখন এর উপরে [Controller] অ্যাট্রিবিউট বসিয়ে দিলে .NET বুঝতে পারে যে এটাও একটা কন্ট্রোলার। এর বাইরে এর খুব একটা কাজ নেই।
- [ApiController]: * এটা API ডেভেলপারদের জীবন সহজ করার জাদুকরী টুল! শুধু API কন্ট্রোলারের উপরে এটা বসানো হয়।
- উপকারিতা: এটা দিলে বেশ কিছু জিনিস অটোমেটিক হয়ে যায়:
- মডেল ভ্যালিডেশন: ক্লায়েন্ট ভুল ডেটা পাঠালে তোমাকে আর কষ্ট করে if (!ModelState.IsValid) লিখতে হয় না। এই অ্যাট্রিবিউট নিজেই চেক করে ভুল পেলে সরাসরি 400 Bad Request রিটার্ন করে দেয়।
- রাউটিং বাধ্যতামূলক: এটা ব্যবহার করলে [Route] অ্যাট্রিবিউট দেওয়াটা বাধ্যতামূলক হয়ে যায়, ফলে এপিআই-এর ইউআরএল নিয়ে কোনো কনফিউশন তৈরি হয় না।
- স্মার্ট ডেটা বাইন্ডিং: ডেটা কি ইউআরএল থেকে আসছে, নাকি বডি (JSON) থেকে আসছে, সেটা এটা নিজে থেকেই বেশ ভালোভাবে অনুমান করে নিতে পারে ([FromBody] বা [FromQuery] অনেক জায়গায় না লিখলেও চলে)। সংক্ষেপে: না লিখলেও কোড কাজ করবে, কিন্তু কোড অনেক বড় হয়ে যাবে এবং বারবার একই ভ্যালিডেশন বা রেসপন্স লজিক লিখতে হবে। এই ক্লাস আর অ্যাট্রিবিউটগুলো মূলত তোমার সময় বাঁচানোর শর্টকাট।
- উপকারিতা: এটা দিলে বেশ কিছু জিনিস অটোমেটিক হয়ে যায়: