CodeShot
Hexagonal Architecture1 دقیقه مطالعه

Hexagonal Architecture (Ports & Adapters) چیست؟

الگویی که هسته برنامه را با Portها (Interface) و Adapterها (پیاده‌سازی) از دنیای بیرون — UI، دیتابیس، پیام‌رسان — جدا می‌کند.

چرا مهم است؟

با این جداسازی می‌توان یک Adapter (مثلاً دیتابیس یا کلاینت HTTP) را بدون هیچ تغییری در منطق اصلی برنامه عوض یا در تست با یک نسخه Fake جایگزین کرد.

Port و Adapter

  • Port: یک Interface که هسته برنامه تعریف می‌کند و نیازش را با آن اعلام می‌کند (مثلاً IPaymentGateway).
  • Adapter: پیاده‌سازی واقعی آن Port که به یک فناوری خاص وصل است (مثلاً پیاده‌سازی Stripe یا Zarinpal).

دو نوع Adapter

  • Driving Adapter (ورودی): چیزی که برنامه را صدا می‌زند — مثل یک Controller در ASP.NET Core یا یک Console.
  • Driven Adapter (خروجی): چیزی که برنامه صدا می‌زند — مثل Repository یا کلاینت یک API خارجی.

مثال

// Port — تعریف‌شده در هسته برنامه
public interface IPaymentGateway
{
    Task<bool> ChargeAsync(decimal amount);
}

// Adapter خروجی — پیاده‌سازی واقعی
public class ZarinpalPaymentGateway : IPaymentGateway
{
    public Task<bool> ChargeAsync(decimal amount) => /* تماس با API زرین‌پال */ Task.FromResult(true);
}

نکات مهم

  • هسته برنامه هیچ وابستگی مستقیمی به یک فناوری خاص ندارد؛ فقط با Portها (Interface) صحبت می‌کند.
  • از نظر مفهومی بسیار نزدیک به Onion/Clean Architecture است؛ تفاوت اصلی در واژگان (Port/Adapter در برابر لایه) است.

اشتباه رایج

❌ نوشتن یک Adapter که مستقیماً منطق کسب‌وکار را هم داخل خودش پیاده می‌کند — Adapter فقط باید تبدیل بین دنیای بیرون و Port باشد، نه محل تصمیم‌گیری کسب‌وکار.

خلاصه

Hexagonal Architecture هسته برنامه را با Portها (Interface) از دنیای بیرون جدا می‌کند و هر فناوری بیرونی (دیتابیس، API، پیام‌رسان) از طریق یک Adapter به آن Port وصل می‌شود. این باعث می‌شود تعویض فناوری یا تست هسته با Adapter Fake ساده باشد. از نظر مفهومی هم‌خانواده Onion و Clean Architecture است.

این مطلب مفید بود؟
نشان کردن
مشاهده در Concept Hub ←