আমি Gemini, আপনার Simple Coding Tutor। আজকের সেশনে আপনাকে স্বাগতম!
Outline অনুযায়ী আমরা এখন Section 24-এ আছি এবং আমাদের বর্তমান টপিক হলো Infrastructure Layer (Lecture 327)। আগের লেকচারে আমরা অ্যাপ্লিকেশনের প্রাণকেন্দ্র অর্থাৎ Core Layer তৈরি করেছিলাম। আজ আমরা শিখব কীভাবে আমাদের অ্যাপ্লিকেশনকে বাইরের দুনিয়ার (যেমন Database, Cloud Services, External APIs) সাথে কানেক্ট করতে হয় এবং কেন এই কাজগুলো Infrastructure লেয়ারে করা হয়।
📝 Lecture Summary
ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য পুরো লেকচারের মূল বিষয়গুলো নিচে দেওয়া হলো:
- Role of Infrastructure: Database, Email Services, Azure বা যেকোনো 3rd Party API-এর সাথে কানেকশনের কাজ এই লেয়ারে করা হয়।
- Dependency Rule: Infrastructure লেয়ার Core লেয়ারের ওপর নির্ভর করে (Infrastructure -> Core), কিন্তু Core কখনো Infrastructure-এর ওপর নির্ভর করে না।
- Project Setup:
ContactsManager.Infrastructureনামে নতুন একটি Class Library প্রজেক্ট তৈরি করা হয়েছে। - NuGet Packages: Database-এর সাথে কাজ করার জন্য
Microsoft.EntityFrameworkCoreএবংMicrosoft.EntityFrameworkCore.SqlServerপ্যাকেজ ইনস্টল করা হয়েছে। - Code Migration: পুরনো প্রজেক্ট থেকে
ApplicationDbContextএবং Repository ক্লাসগুলো (যেমন:CountriesRepository,PersonsRepository) Infrastructure প্রজেক্টে কপি করা হয়েছে। - Project Reference: Infrastructure প্রজেক্ট থেকে Core প্রজেক্টের রেফারেন্স অ্যাড করা হয়েছে, যাতে Database Entity ক্লাসগুলোকে অ্যাক্সেস করা যায়।
🔍 Comprehensive Breakdown
The Infrastructure Layer - Connecting to the Outside World (Priority: 10/10)
Why: যেকোনো অ্যাপ্লিকেশনকে সচল রাখতে Database বা External Services-এর প্রয়োজন হয়। কিন্তু Clean Architecture-এর নিয়ম অনুযায়ী Business Logic (Core) এর মধ্যে Database-এর কোড রাখা যাবে না। তাই বাইরের সব এক্সটার্নাল সিস্টেমের সাথে যোগাযোগের জন্য Infrastructure Layer তৈরি করা হয়। এটি সরাসরি Database, Azure Storage বা Email Providers-এর সাথে কাজ করে।
Creating the Infrastructure Project (Priority: 8/10)
Why: Core লেয়ার থেকে Data Access লজিক আলাদা রাখার জন্য এটিকে ভিন্ন একটি প্রজেক্ট হিসেবে তৈরি করতে হয়।
- Visual Studio-তে
srcফোল্ডারের ওপর ডান ক্লিক করে একটি নতুন Class Library প্রজেক্ট তৈরি করা হয়েছে এবং এর নাম দেওয়া হয়েছেContactsManager.Infrastructure। - তৈরি হওয়ার পর ডিফল্ট
Class1.csফাইলটি ডিলিট করে দেওয়া হয়েছে। - (Visual Studio Code Shortcut): টার্মিনালে
dotnet new classlib -n ContactsManager.Infrastructureলিখে সহজেই প্রজেক্ট তৈরি করা যায়।
Installing Entity Framework Core (Priority: 9/10)
Why: যেহেতু আমরা SQL Server Database ব্যবহার করব, তাই ডাটাবেস অপারেশন চালানোর জন্য Entity Framework Core প্রয়োজন।
- Infrastructure প্রজেক্টের NuGet Package Manager থেকে
Microsoft.EntityFrameworkCoreএবংMicrosoft.EntityFrameworkCore.SqlServerইন্সটল করা হয়েছে। - Note: এই প্যাকেজগুলো Core লেয়ারে ইন্সটল করা হয়নি, কারণ Core লেয়ার Database Independent।
Migrating DbContext & Repositories (Priority: 10/10)
Why: DbContext হলো Entity Framework-এর ডাটাবেস সেশন, যা সরাসরি Data Access-এর কাজ করে। আর Repository ক্লাসগুলো সরাসরি ডাটাবেসে কুয়েরি চালায়। তাই এদের সঠিক জায়গা হলো Infrastructure লেয়ার।
- Infrastructure প্রজেক্টে
DbContextনামে একটি ফোল্ডার তৈরি করে সেখানে আগের প্রজেক্ট থেকেApplicationDbContextকপি করা হয়েছে। Repositoriesনামে আরেকটি ফোল্ডার তৈরি করে সেখানেCountriesRepositoryএবংPersonsRepositoryকপি করা হয়েছে।
Setting up Project Dependency (Priority: 10/10)
Why: ApplicationDbContext ফাইলে Core প্রজেক্টের Entity ক্লাসগুলো (Country, Person) দরকার। একইভাবে Repository ক্লাসগুলোতে Core প্রজেক্টের Interface (ICountriesRepository) ইমপ্লিমেন্ট করতে হবে। তাই Infrastructure-কে Core-এর চিনে রাখা প্রয়োজন।
- Infrastructure প্রজেক্টের Dependencies-এ ডান ক্লিক করে Add Project Reference সিলেক্ট করে Core প্রজেক্টটিকে রেফারেন্স হিসেবে অ্যাড করা হয়েছে।
- (Visual Studio Code Shortcut): টার্মিনালে
dotnet add ContactsManager.Infrastructure/ContactsManager.Infrastructure.csproj reference ContactsManager.Core/ContactsManager.Core.csprojকমান্ড ব্যবহার করে রেফারেন্স অ্যাড করা যায়।
💻 Code Implementation (Infrastructure Layer)
1. ApplicationDbContext (Infrastructure Layer): Core লেয়ারের Entity ক্লাসগুলো এখানে DbSet হিসেবে ব্যবহৃত হচ্ছে।
using ContactsManager.Core.Domain.Entities; // Core Layer-এর রেফারেন্স
using Microsoft.EntityFrameworkCore; // Infrastructure-এর প্যাকেজ
namespace ContactsManager.Infrastructure.DbContext
{
public class ApplicationDbContext : Microsoft.EntityFrameworkCore.DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
// Core প্রজেক্টের Entity ক্লাসগুলো এখানে যুক্ত করা হলো
public DbSet<Country> Countries { get; set; }
public DbSet<Person> Persons { get; set; }
}
}
2. Repository Implementation (Infrastructure Layer): Core লেয়ারে থাকা Interface-কে Infrastructure লেয়ারে ইমপ্লিমেন্ট করা হয়েছে।
using ContactsManager.Core.Domain.Entities;
using ContactsManager.Core.Domain.RepositoryContracts; // Core Layer Interface
using ContactsManager.Infrastructure.DbContext;
using Microsoft.EntityFrameworkCore;
namespace ContactsManager.Infrastructure.Repositories
{
// Interface আসছে Core থেকে, আর ইমপ্লিমেন্টেশন হচ্ছে Infrastructure-এ
public class PersonsRepository : IPersonsRepository
{
private readonly ApplicationDbContext _db;
public PersonsRepository(ApplicationDbContext db)
{
_db = db;
}
public async Task<Person> AddPerson(Person person)
{
_db.Persons.Add(person);
await _db.SaveChangesAsync();
return person;
}
}
}
🚀 .NET 10 Updates & Smarter Ways
লেকচারে .NET 6 ব্যবহার করা হয়েছে, কিন্তু আপনি যদি .NET 10 ব্যবহার করেন, তবে C# 12+ এর নতুন ফিচার Primary Constructors ব্যবহার করে Repository ক্লাসগুলোকে আরও অনেক ক্লিন এবং ছোট করে লিখতে পারবেন।
Primary Constructor Example (.NET 10): আলাদাভাবে Constructor ডিক্লেয়ার না করে ক্লাসের নামের সাথেই Dependency Inject করা যায়।
// Constructor সরাসরি ক্লাসের নামের সাথে যুক্ত করা হয়েছে
public class PersonsRepository(ApplicationDbContext db) : IPersonsRepository
{
public async Task<Person> AddPerson(Person person)
{
// সরাসরি 'db' ভেরিয়েবল ব্যবহার করা যাচ্ছে
db.Persons.Add(person);
await db.SaveChangesAsync();
return person;
}
}
Note: NuGet প্যাকেজ ইন্সটল করার সময়ও নিশ্চিত করবেন যেন Microsoft.EntityFrameworkCore.SqlServer এর ভার্সন আপনার .NET 10 SDK-এর সাথে সামঞ্জস্যপূর্ণ হয় (যেমন Version 10.x.x)।
🌟 Best Practices
- No Business Logic in Repositories: Repository ক্লাসের ভেতরে কোনো Business Logic (যেমন: ট্যাক্স ক্যালকুলেশন, ভ্যালিডেশন) লিখবেন না। Repository-এর কাজ শুধুমাত্র Database থেকে ডাটা আনা এবং সেভ করা।
- Keep Dependencies One-Way: সব সময় মনে রাখবেন:
Infrastructure -> Core। কখনোই ভুল করেও Core প্রজেক্ট থেকে Infrastructure প্রজেক্টের রেফারেন্স অ্যাড করবেন না। - Use Asynchronous Programming: Database কলের সময় সব সময়
asyncএবংawaitব্যবহার করুন (যেমনSaveChangesAsync()), এতে অ্যাপ্লিকেশনের পারফরম্যান্স অনেক ভালো থাকে।