Onion Architecture چیست؟
معماریای که برنامه را در لایههای متحدالمرکز میچیند؛ وابستگیها همیشه رو به داخل و بهسمت هسته (Domain) جریان دارند.
چرا مهم است؟
با نگهداشتن هسته کسبوکار مستقل از دیتابیس، UI و فریمورک، تغییر زیرساخت (مثلاً عوضکردن SQL Server با PostgreSQL) بدون دستکاری منطق دامنه ممکن میشود.
لایهها (از داخل به بیرون)
Domain Model → Domain Services → Application Services → Infrastructure / Presentation
هر لایه فقط مجاز است به لایهٔ داخلیتر از خودش وابسته باشد، هرگز برعکس. دقیقاً مثل لایههای پیاز — به همین دلیل این نام را دارد.
قانون وابستگی
Domain هیچ ارجاعی به Infrastructure یا Presentation ندارد. اگر Domain به یک سرویس بیرونی نیاز دارد، یک Interface در همان لایه تعریف میکند و پیادهسازی در Infrastructure نوشته میشود (Dependency Inversion).
مثال
// لایه Domain — فقط Interface
public interface IOrderRepository
{
Task<Order?> GetByIdAsync(Guid id);
}
// لایه Infrastructure — پیادهسازی وابسته به EF Core
public class EfOrderRepository : IOrderRepository
{
private readonly AppDbContext _db;
public EfOrderRepository(AppDbContext db) => _db = db;
public Task<Order?> GetByIdAsync(Guid id) => _db.Orders.FindAsync(id).AsTask();
}
نکات مهم
- Domain Model شامل Entityها و منطق کسبوکار خالص است، بدون هیچ وابستگی خارجی.
- Onion و Clean Architecture مفهومی تقریباً یکسان دارند؛ تفاوت اصلی در نامگذاری و تعداد لایههاست.
اشتباه رایج
❌ تزریق مستقیم DbContext به داخل لایه Domain — این کار قانون وابستگی را میشکند و هسته برنامه را به EF Core وابسته میکند.
خلاصه
Onion Architecture برنامه را در لایههای متحدالمرکز میچیند که وابستگیها فقط رو به داخل جریان دارند. هسته Domain هیچ وابستگی به دیتابیس یا فریمورک ندارد و از طریق Interface با بیرون ارتباط میگیرد. این جداسازی تستپذیری و امکان تعویض زیرساخت را بالا میبرد.
