CodeShot

Primary/Driving Adapters در مقابل Secondary/Driven Adapters

Primary Adapter (یا Driving Adapter) نقطه‌ای است که از بیرون هسته برنامه را فرا می‌خواند، مثل یک Controller وب یا یک دستور CLI، در حالی که Secondary Adapter (یا Driven Adapter) پیاده‌سازی چیزی است که خود هسته برنامه به آن نیاز دارد و آن را فرا می‌خواند، مثل یک Repository که به دیتابیس متصل می‌شود.

ویژگیPrimary/Driving AdaptersSecondary/Driven Adapters
جهت فراخوانیبیرون به داخل هستههسته به بیرون
مثالController، CLIRepository، Email Sender
نقش هستهفراخوانده‌شدهفراخواننده

کِی از Primary/Driving Adapters استفاده کنیم؟

وقتی می‌خواهید یک روش جدید برای فراخوانی برنامه اضافه کنید، مثل یک وب API جدید، یک صف پیام یا یک رابط CLI.

کِی از Secondary/Driven Adapters استفاده کنیم؟

وقتی می‌خواهید پیاده‌سازی یک وابستگی خارجی مورد نیاز هسته برنامه را تعریف یا تعویض کنید، مثل تغییر دیتابیس یا سرویس ایمیل.

مثال Primary/Driving Adapters

// Primary Adapter: ورودی از بیرون به هسته
[HttpPost]
public IActionResult CreateOrder(CreateOrderRequest req)
    => Ok(_orderService.Create(req));

مثال Secondary/Driven Adapters

// Secondary Adapter: پیاده‌سازی یک Port برای هسته
public class SqlOrderRepository : IOrderRepository
{
    public Task SaveAsync(Order o) => _db.SaveAsync(o);
}

اشتباه رایج

اشتباه رایج قرار دادن منطق کسب‌وکار مستقیماً داخل یک Primary Adapter مثل Controller است؛ این کار هسته برنامه را به جزئیات وب وابسته می‌کند، در حالی که Adapter باید فقط ورودی را ترجمه و به هسته پاس دهد.

جمع‌بندی

Primary Adapter نقطه ورود از بیرون به هسته است و Secondary Adapter پیاده‌سازی وابستگی‌های موردنیاز هسته است؛ هر دو باید فقط از طریق Port های تعریف‌شده با هسته صحبت کنند.