Dependency Injection (DI) একটি ডিজাইন প্যাটার্ন যা কম্পোনেন্ট বা ক্লাসগুলোর মধ্যে ডিপেনডেন্সি (অথবা প্রয়োজনীয় অবজেক্ট) ইনজেক্ট করার মাধ্যমে তাদের মধ্যে সংযুক্তি (coupling) কমিয়ে আনে। ASP.NET Core অ্যাপ্লিকেশনের মধ্যে DbContext এর ইনস্ট্যান্স ইনজেক্ট করার জন্য DI ব্যবহৃত হয়, যার ফলে ডেটাবেসের সাথে কাজ করা আরো সহজ এবং টেস্টেবল হয়।
ASP.NET Core এর মধ্যে DbContext কে Dependency Injection ব্যবহার করে ইনজেক্ট করা হয়, যাতে ডেটাবেস অ্যাক্সেসের জন্য কনফিগারেশন এবং জীবনচক্র (lifecycle) পরিচালনা করা সহজ হয়। DbContext কে DI মাধ্যমে ব্যবহার করার সুবিধা হলো, এটি আপনাকে একটি কনট্রোল্ড লাইফটাইম প্রদান করে, যেমন scoped lifetime, যাতে এক HTTP রিকোয়েস্টে একটাই DbContext তৈরি হয়।
ASP.NET Core অ্যাপ্লিকেশন তৈরি করার সময়, DbContext কে DI কনটেইনারে রেজিস্টার করতে হয়। এটি সাধারণত Startup.cs ফাইলে করা হয়, যেখানে আপনি ConfigureServices
মেথডে এটি কনফিগার করেন।
এখানে, ASP.NET Core এর মাধ্যমে DbContext কে DI এ কিভাবে রেজিস্টার এবং ব্যবহার করতে হয় তা দেখানো হলো।
ধরা যাক, আমাদের একটি ApplicationDbContext
নামে DbContext ক্লাস রয়েছে এবং এটি SQL Server ডেটাবেস ব্যবহার করবে।
প্রথমে, ApplicationDbContext
তৈরি করি যা আপনার ডেটাবেসের টেবিলের সাথে যোগাযোগ করবে।
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{ }
public DbSet<Employee> Employees { get; set; }
}
এখন, Startup.cs
ফাইলে ConfigureServices
মেথডে DbContext কে DI কনটেইনারে রেজিস্টার করতে হবে। এর মাধ্যমে ASP.NET Core নিশ্চিত করবে যে, আপনি যেকোনো ক্লাসে ApplicationDbContext এর ইনস্ট্যান্স সরাসরি ইনজেক্ট করতে পারবেন।
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// DbContext রেজিস্টার করা
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
// অন্যান্য সার্ভিস রেজিস্টার করা
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// অ্যাপ কনফিগারেশন
}
}
এখানে, AddDbContext<ApplicationDbContext>
মেথড ব্যবহার করে আমরা DbContext রেজিস্টার করেছি, এবং এটি SQL Server ডেটাবেসের সাথে সংযুক্ত হবে, যেখানে Configuration.GetConnectionString("DefaultConnection")
আপনার appsettings.json ফাইল থেকে ডেটাবেস কানেকশন স্ট্রিং টানবে।
এখন, আপনি যেকোনো ক্লাসে, যেমন Controller বা Service ক্লাসে, ApplicationDbContext
ইনজেক্ট করতে পারবেন।
এখন, আপনার Controller ক্লাসে ApplicationDbContext
ইনজেক্ট করা হবে:
public class EmployeeController : Controller
{
private readonly ApplicationDbContext _context;
// Dependency Injection এর মাধ্যমে DbContext ইনজেক্ট করা
public EmployeeController(ApplicationDbContext context)
{
_context = context;
}
// Employee লিস্ট প্রদর্শন করা
public async Task<IActionResult> Index()
{
var employees = await _context.Employees.ToListAsync();
return View(employees);
}
}
এখানে, ApplicationDbContext
কে কনস্ট্রাক্টর ইনজেকশন (constructor injection) এর মাধ্যমে EmployeeController ক্লাসে ইনজেক্ট করা হয়েছে। এটি তখন স্বয়ংক্রিয়ভাবে ডেটাবেসের সাথে যোগাযোগ করতে পারে।
আপনি Service Layer ব্যবহার করলেও DbContext ইনজেক্ট করতে পারবেন। উদাহরণস্বরূপ:
public class EmployeeService
{
private readonly ApplicationDbContext _context;
// Dependency Injection এর মাধ্যমে DbContext ইনজেক্ট করা
public EmployeeService(ApplicationDbContext context)
{
_context = context;
}
public async Task<IEnumerable<Employee>> GetAllEmployeesAsync()
{
return await _context.Employees.ToListAsync();
}
}
এখন, আপনি এই EmployeeService
ক্লাসটিকে Controller বা অন্য কোনো জায়গায় ইনজেক্ট করে ব্যবহার করতে পারবেন।
DbContext
সাধারণত scoped lifetime হিসেবে রেজিস্টার করা হয়, অর্থাৎ এটি এক HTTP রিকোয়েস্টের জন্য একটি ইনস্ট্যান্স তৈরি হয় এবং সেই রিকোয়েস্টের সাথে সংযুক্ত থাকে। ডিফল্টভাবে, যখন আপনি AddDbContext
ব্যবহার করেন, তখন এটি scoped লাইফটাইমে রেজিস্টার করা হয়, যা নিশ্চিত করে যে, এক রিকোয়েস্টের জন্য একটাই DbContext ব্যবহার হবে।
এটি নিশ্চিত করে যে, আপনি যখন DbContext
ইনজেক্ট করেন, তখন প্রতিটি HTTP রিকোয়েস্টের জন্য এটি একটি নতুন ইনস্ট্যান্স তৈরি হয় এবং সেটি ডেটাবেস ট্রানজেকশন এবং টেস্টিং এর জন্য উপযোগী।
DbContext
DI এর মাধ্যমে কনটেইনারের মাধ্যমে পরিচালিত হওয়ার ফলে লাইফটাইম ম্যানেজমেন্ট সহজ হয়।Dependency Injection (DI) এর মাধ্যমে DbContext
ব্যবহার করার ফলে, অ্যাপ্লিকেশন ডিজাইনে ক্লিন কোড এবং টেস্টেবিলিটি আসে। ASP.NET Core অ্যাপ্লিকেশনগুলোতে DbContext কে DI মাধ্যমে ইনজেক্ট করে, আপনি ডেটাবেস অপারেশনগুলোকে কেন্দ্র করে পরিষ্কার, মডুলার, এবং টেস্টযোগ্য স্থাপত্য তৈরি করতে পারেন।
common.read_more