হ্যালো হাসিব! এই লেকচারটি মূলত ASP.NET Core MVC-তে Attribute Routing অপটিমাইজেশন নিয়ে। আমরা এর আগে প্রতিটি Action Method-এর উপরে পুরো URL রুট (যেমন: [Route("persons/index")]) বারবার লিখেছিলাম। এই লেকচারে দেখানো হয়েছে কীভাবে কোড রিপিটেশন কমিয়ে Routing আরও ক্লিন এবং ডাইনামিক করা যায়।
চলো প্রথমে লেকচারটির একটি কুইক সামারি দেখে নিই।
📌 Quick Summary for Revision
- Controller Level Route: প্রতিটি মেথডে
persons/না লিখে, Controller ক্লাসের উপরে[Route("persons")]ব্যবহার করে একটি কমন প্রিফিক্স তৈরি করা। - Route Override (
/): মেথড লেভেলের রুটের শুরুতে/(স্ল্যাশ) দিলে সেটি Controller-লেভেলের প্রিফিক্সকে ইগনোর করে ওভাররাইড করে দেয় (যেমন:[Route("/index")])। - Route Tokens (
[controller],[action]): হার্ডকোড করে Controller বা Action মেথডের নাম না লিখে ডায়নামিক টোকেন ব্যবহার করা, যাতে নাম চেঞ্জ করলে রুটেও অটোমেটিক চেঞ্জ হয়ে যায়।
🚀 Comprehensive Breakdown & The “Why”
নিচে লেকচারের প্রতিটি কনসেপ্ট বিস্তারিত এবং কারণসহ এক্সপ্লেইন করা হলো:
১. Controller Level Route Prefix [Priority: 10/10]
The “Why”: আমরা যখন PersonsController তৈরি করি, তখন এর ভেতরের সব মেথডের URL-এর শুরুতেই সাধারণত persons/ থাকে (যেমন: persons/index, persons/create)। প্রতিটি মেথডের উপরে [Route("persons/xxx")] বারবার লেখা DRY (Don’t Repeat Yourself) প্রিন্সিপালের লঙ্ঘন। এর সমাধান হলো Controller ক্লাসের উপরে একবার কমন প্রিফিক্স দিয়ে দেওয়া।
Implementation:
[Route("persons")] // Common Prefix
public class PersonsController : Controller
{
// এটি অটোমেটিক "persons/index" হয়ে যাবে
[Route("index")]
[Route("/")] // ডিফল্ট রুট (root url) এর জন্য
public IActionResult Index()
{
return View();
}
// এটি অটোমেটিক "persons/create" হয়ে যাবে
[Route("create")]
public IActionResult Create()
{
return View();
}
}
২. Route Override (/ Prefix) [Priority: 7/10]
The “Why”: মাঝে মাঝে এমন হতে পারে যে, আমাদের Controller-এর উপরে একটি প্রিফিক্স দেওয়া আছে, কিন্তু কোনো একটি নির্দিষ্ট মেথডের জন্য আমরা সেই প্রিফিক্স চাই না। তখন রুটের শুরুতে একটি ফরওয়ার্ড স্ল্যাশ / দিলে তা প্রিফিক্সকে ওভাররাইড করে একদম রুট ডোমেইন থেকে URL তৈরি করে।
Implementation:
[Route("persons")]
public class PersonsController : Controller
{
// স্ল্যাশ থাকার কারণে "persons/index" হবে না, শুধু "localhost:xxxx/index" হবে
[Route("/index")]
public IActionResult Index()
{
return View();
}
}
নোট: আমাদের প্রজেক্টে এই ওভাররাইডের দরকার নেই, লেকচারার শুধু কনসেপ্ট বোঝানোর জন্য এটি দেখিয়েছেন।
৩. Route Tokens ([controller] এবং [action]) [Priority: 10/10]
The “Why”: যদি আমরা হার্ডকোড করে [Route("persons")] বা [Route("index")] লিখি, আর ভবিষ্যতে কোনো কারণে ক্লাসের নাম বা মেথডের নাম পরিবর্তন করি, তাহলে রুটগুলো ম্যানুয়ালি পরিবর্তন করতে হবে, নাহলে 404 Error আসবে। এই সমস্যা সমাধানের জন্য Route Tokens ব্যবহার করা হয়। স্কয়ার ব্র্যাকেটের [] ভেতরে টোকেন দিলে ফ্রেমওয়ার্ক রানটাইমে অটোমেটিক নামগুলো বসিয়ে নেয়।
Implementation (Best Practice):
// [controller] অটোমেটিক ক্লাসের নাম (Persons) নিয়ে নেবে ("Controller" শব্দটা বাদে)
[Route("[controller]")]
public class PersonsController : Controller
{
// [action] অটোমেটিক মেথডের নাম (Index) নিয়ে নেবে
[Route("[action]")]
[Route("/")]
public IActionResult Index()
{
return View();
}
// এটি অটোমেটিক "persons/create" হবে
[Route("[action]")]
[HttpGet]
public IActionResult Create()
{
return View();
}
}
🆕 .NET 10 & Modern Approaches (Conventional vs Attribute Routing)
লেকচারে যা দেখানো হয়েছে, তা Attribute Routing-এর মডার্ন এবং বেস্ট প্র্যাকটিস, যা .NET 10-এও হুবহু একইভাবে কাজ করে। তবে রিয়েল-ওয়ার্ল্ড প্রজেক্টে সাধারণত দুই ধরনের রাউটিং মিক্স করে ব্যবহার করা হয়:
- API Controllers: ওয়েব এপিআইয়ের ক্ষেত্রে সব সময় টোকেন-বেসড Attribute Routing (
[Route("api/[controller]")]) ব্যবহার করা বেস্ট প্র্যাকটিস। - MVC Controllers: MVC ভিউয়ের ক্ষেত্রে
Program.csফাইলে গ্লোবাল Conventional Routing সেট করে দিলে Controller-এ কোনো[Route]ট্যাগই লিখতে হয় না!
// Program.cs - Conventional Routing (No need for [Route] tags in controllers)
app.MapControllerRoute(
name: "default",
pattern: "{controller=Persons}/{action=Index}/{id?}");
তবে যেহেতু লেকচারার Attribute Routing ফোকাস করে শেখাচ্ছেন, আমরা এটাই ফলো করবো।
⌨️ IDE Shortcuts
- Rename Symbol (ক্লাস বা মেথডের নাম সব জায়গায় একসাথে চেঞ্জ করা): * Visual Studio: নামের ওপর সিলেক্ট করে
Ctrl+R,Ctrl+R - Visual Studio Code:
F2(টোকেন ব্যবহার করলে এই শর্টকাট দিয়ে নাম পরিবর্তন করলে রাউটিং ব্রেক করবে না!)
💡 Best Practices (Routing)
১. Always use Tokens: হার্ডকোড স্ট্রিংয়ের বদলে সবসময় [controller] এবং [action] ব্যবহার করবে।
২. Avoid Over-routing: একটি মেথডের উপরে ২-৩টির বেশি [Route] ডিক্লেয়ার করা উচিত নয়, এতে কনফিউশন তৈরি হয়।
৩. Lowercase URLs: সাধারণত ওয়েবসাইটের URL-গুলো ছোট হাতের অক্ষরে (lowercase) হওয়া বেস্ট প্র্যাকটিস (SEO-এর জন্য)। ASP.NET Core-এ Program.cs-এ নিচের কোডটি দিলে সব রুট অটোমেটিক lowercase হয়ে যায়:
builder.Services.AddRouting(options => options.LowercaseUrls = true);
Attribute Routing-এর অপটিমাইজেশন নিয়ে কি আর কোনো কনফিউশন আছে? এরপর কি আমরা অন্য কোনো টপিক বা Client-Side Validation-এ মুভ করবো?