আমি Gemini, আপনার Simple Coding Tutor। আজকের সেশনে আপনাকে স্বাগতম!
Outline অনুযায়ী, আমরা এখন Section 24-এ আছি এবং আমাদের বর্তমান টপিক হলো “Overview of Clean Architecture” (Lecture 325)। এর আগে আমরা SOLID Principles শিখেছি, যা Clean Architecture বোঝার জন্য দারুণ ভিত্তি তৈরি করেছে। আজকের লেকচারে আমরা শিখব কীভাবে বড় এবং স্কেলেবল প্রোজেক্টের জন্য কোডকে নিখুঁতভাবে সাজাতে হয়।
📝 Lecture Summary
ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য পুরো লেকচারের মূল বিষয়গুলো নিচে দেওয়া হলো:
- Clean Architecture-এ Dependency Inversion ব্যবহার করে লেয়ারগুলোকে ডিকাপল করা হয়।
- N-tier Architecture-এর মতো এখানে Business Logic লেয়ার Data Access লেয়ারের ওপর নির্ভরশীল নয়।
- Core (Business Logic) লেয়ারটি অ্যাপ্লিকেশনের কেন্দ্রে থাকে এবং অন্য সব লেয়ার এর ওপর নির্ভর করে।
- Domain লেয়ারটি Core লেয়ারের একটি অংশ, যেখানে Entity Classes এবং Repository Interfaces থাকে।
- Infrastructure লেয়ারে Database, External API এবং File System-এর কাজ হয়।
- Clean Architecture অ্যাপ্লিকেশনের Testability এবং Scalability বৃদ্ধি করে।
🔍 Comprehensive Breakdown
N-Tier Architecture বনাম Clean Architecture (Priority: 10/10)
সাধারণত N-tier Architecture-এ Business Logic লেয়ার সরাসরি Data Access Layer-এর ওপর নির্ভর করে। এর মানে হলো, Database বা Data Access Layer-এ কোনো পরিবর্তন হলে তার প্রভাব Business Logic-এও পড়ে। কিন্তু Clean Architecture-এ এই Dependency ইনভার্স (Inverse) করা হয়। এখানে Business Logic (Core) কারো ওপর নির্ভর করে না; বরং Data Access (Infrastructure) লেয়ার Business Logic-এর ওপর নির্ভর করে। একে Onion Architecture-ও বলা হয়, কারণ লেয়ারগুলো একটির ওপর আরেকটি পেঁয়াজের খোসার মতো আবৃত থাকে।
Core Layer (Priority: 10/10)
Core লেয়ার হলো অ্যাপ্লিকেশনের প্রাণকেন্দ্র। এটি সম্পূর্ণ স্বাধীন এবং অন্য কোনো লেয়ারের ওপর নির্ভরশীল নয়।
- এখানে Service Contracts (Interfaces), Service Implementations এবং Data Transfer Objects (DTOs) থাকে।
- অ্যাপ্লিকেশনের মূল Business Logic এবং ডিসিশন মেকিং এখানেই সম্পন্ন হয়।
- এটি UI বা Database টেকনোলজির ওপর নির্ভরশীল নয়।
Domain Layer (Priority: 9/10)
Domain লেয়ারটি লজিক্যালি Core লেয়ারেরই একটি অংশ।
- এখানে Entity Classes (যেমন: Country, Person) থাকে।
- Data Annotations ব্যবহার করে Table লেভেলের Validation এখানেই করা হয়।
- Repository Interfaces (যেমন:
ICountriesRepository) এই লেয়ারেই ডিফাইন করা থাকে।
Infrastructure Layer (Priority: 10/10)
Infrastructure লেয়ার মূলত অ্যাপ্লিকেশনের বাইরের দুনিয়ার সাথে যোগাযোগের কাজ করে।
- Database (যেমন: SQL Server, PostgreSQL), External APIs, Microservices বা File System-এর সাথে কানেকশন এখানেই ম্যানেজ করা হয়।
- Entity Framework Core-এর
DbContextএবং Repository Interfaces-এর ইমপ্লিমেন্টেশন এই লেয়ারে থাকে। - এই লেয়ারটি Core লেয়ারের ওপর নির্ভরশীল, তাই এটি Core থেকে Entity Classes এবং Interfaces অ্যাক্সেস করতে পারে।
UI Layer / ASP.NET Core Project (Priority: 8/10)
UI প্রজেক্টটি হলো আমাদের মূল ASP.NET Core প্রজেক্ট।
- Controllers, ViewModels, Views, Middleware, Custom Validators এবং Filters এই লেয়ারে থাকে।
- এটি Core এবং Infrastructure উভয়ের সাথেই কানেক্টেড থাকে (সাধারণত Dependency Injection-এর মাধ্যমে)।
Clean Architecture এর সুবিধা ও Design Goals (Priority: 9/10)
- Database Independence: যেকোনো সময় SQL Server থেকে PostgreSQL-এ সুইচ করা যায়, Business Logic-এ কোনো পরিবর্তন ছাড়াই।
- Scalability: ট্রাফিক বাড়লে সহজে Scale Up (CPU/Memory বাড়ানো) বা Scale Out (নতুন সার্ভার/VM যুক্ত করা) করা যায়।
- Testability: Business Logic লেয়ার ডাটাবেসের ওপর নির্ভরশীল না হওয়ায়, Mocking-এর মাধ্যমে খুব সহজেই Unit Testing করা যায়।
💻 Code Implementation (Core vs Infrastructure)
1. Domain Layer (Core Project): এখানে আমরা শুধু Interface ডিফাইন করব।
namespace StocksApp.Core.Domain.RepositoryContracts
{
// এটি Core লেয়ারে থাকবে
public interface IPersonsRepository
{
Task<Person> AddPerson(Person person);
}
}
2. Infrastructure Layer (Infrastructure Project): এখানে আমরা Interface-টি ইমপ্লিমেন্ট করব এবং Database-এর কাজ করব।
using StocksApp.Core.Domain.RepositoryContracts;
namespace StocksApp.Infrastructure.Repositories
{
// এটি Infrastructure লেয়ারে থাকবে এবং Core লেয়ারের ওপর নির্ভর করবে
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;
}
}
}
🌟 Best Practices & .NET 10 Updates
- Best Practice: ఎকটি Project Solution-এ Core, Infrastructure এবং UI-এর জন্য আলাদা আলাদা Class Library প্রজেক্ট তৈরি করুন। এতে Dependency Rule ব্রেক করার সম্ভাবনা কমে যায়।
- Best Practice: Controller-এ কখনো সরাসরি DbContext বা Repository কল করবেন না। Controller শুধুমাত্র Service (Core layer) কল করবে।
.NET 10 Update (Dependency Injection in Program.cs):
.NET এর নতুন ভার্সনগুলোতে Program.cs অনেক ক্লিন হয়ে গেছে। Top-level statements ব্যবহার করে Infrastructure এবং Core-এর Dependency Injection খুব সহজেই করা যায়। এছাড়া C# এর নতুন “Primary Constructors” ফিচার ব্যবহার করে Service ক্লাসগুলো আরও সুন্দরভাবে লেখা যায়।
// Program.cs (.NET 10 Style)
var builder = WebApplication.CreateBuilder(args);
// Registering Infrastructure and Core services
builder.Services.AddScoped<IPersonsRepository, PersonsRepository>();
builder.Services.AddScoped<IPersonsService, PersonsService>();
var app = builder.Build();
app.MapControllers();
app.Run();