১. AddScoped (নিয়ম বা Rule): AddScoped কোনো স্কোপ না, এটা হলো একটা নিয়ম বা রুল যেটা তুমি Program.cs ফাইলে বলে দাও। এটা ফ্রেমওয়ার্ককে বলে: “ভাই, যখনই নতুন কোনো ‘Scope’ বা বাউন্ডারি তৈরি হবে, আমার জন্য একটা নতুন অবজেক্ট বানাবা। আর ওই একই স্কোপের ভেতর কেউ ডাকলে ওই সেম অবজেক্টটাই দিবা।”।
২. Scope / Main Scope (ডিফল্ট সীমানা): যখন ইউজার ব্রাউজার থেকে কোনো রিকোয়েস্ট পাঠায় (যেমন Chatrabash-এ লগিন করলো), .NET নিজে থেকেই একটা ডিফল্ট ‘Scope’ বা সীমানা তৈরি করে। এটাই হচ্ছে তোমার মেইন বাউন্ডারি। এই বাউন্ডারির ভেতরে ওই AddScoped নিয়ম অনুযায়ী একটাই অবজেক্ট তৈরি হয়।
৩. Child Scope (তোমার বানানো নতুন সীমানা): Child scope হলো তোমার নিজের হাতে বানানো একটা নতুন, ছোট সীমানা (যেটা তুমি using (var scope = _serviceScopeFactory.CreateScope()) দিয়ে বানাও)।
আসল খেলা (The Connection): যখন তুমি Child Scope বানাও, তুমি আসলে ফ্রেমওয়ার্ককে বলছো: “মেইন রিকোয়েস্টের ভেতর আমি নতুন আরেকটা ছোট স্কোপ বানালাম।”
তখন ফ্রেমওয়ার্ক কী করে? সে AddScoped-এর নিয়ম চেক করে। নিয়মে বলা ছিল “প্রতি স্কোপে একটা করে নতুন অবজেক্ট হবে”। তাই ফ্রেমওয়ার্ক যখন দেখে তুমি Child Scope (নতুন স্কোপ) বানিয়েছো, সে ওই AddScoped করা সার্ভিসের আরেকটা সম্পূর্ণ নতুন অবজেক্ট বানিয়ে তোমার চাইল্ড স্কোপের ভেতর দিয়ে দেয়।
আর ওই চাইল্ড স্কোপটা using ব্লক শেষ হওয়ার সাথে সাথেই ডিলিট হয়ে যায় (Dispose হয়), যার ফলে ওই নতুন অবজেক্টটাও সাথে সাথেই ডেস্ট্রয় হয়ে যায়। কিন্তু মেইন স্কোপের অবজেক্টটা তখনও বেঁচে থাকে, কারণ ওটা তো মেইন রিকোয়েস্টের সাথে যুক্ত।
এককথায়: AddScoped হলো নিয়ম (প্রতি স্কোপে ১ টা অবজেক্ট)। আর Child Scope হলো তোমার নিজের হাতে বানানো নতুন একটা স্কোপ, যার কারণে ওই নিয়ম অনুযায়ী ফ্রেমওয়ার্ক বাধ্য হয়ে আরেকটা সম্পূর্ণ নতুন অবজেক্ট তৈরি করে।