Vertical Slice Architecture چیست؟
بهجای لایهبندی افقی مشترک (Controller/Service/Repository برای همه Featureها)، کد بر اساس هر Feature بهصورت عمودی و مستقل سازماندهی میشود.
چرا مهم است؟
تغییر یک Feature فقط همان Slice را درگیر میکند و ریسک اثرگذاری ناخواسته روی Featureهای دیگر که در معماری لایهای مشترک رایج است را حذف میکند.
ایده اصلی
هر Feature/Use Case یک «برش عمودی» کامل از برنامه است — از دریافت Request تا پاسخ نهایی — و در یک پوشه مستقل قرار میگیرد، نه پخششده بین پوشههای مشترک Controllers/Services/Repositories.
ساختار پوشه
Features/
Orders/
CreateOrder/
CreateOrderCommand.cs
CreateOrderHandler.cs
CreateOrderValidator.cs
GetOrderById/
GetOrderByIdQuery.cs
GetOrderByIdHandler.cs
مثال با MediatR
public record CreateOrderCommand(Guid CustomerId, decimal Amount) : IRequest<Guid>;
public class CreateOrderHandler : IRequestHandler<CreateOrderCommand, Guid>
{
public async Task<Guid> Handle(CreateOrderCommand request, CancellationToken ct)
{
// منطق ساخت سفارش، مستقل از سایر Featureها
return Guid.NewGuid();
}
}
نکات مهم
- معمولاً همراه با CQRS و MediatR پیاده میشود، اما وابسته به آنها نیست.
- اشتراک کد بین Sliceها عمداً محدود نگه داشته میشود؛ کمی تکرار قابل قبولتر از یک انتزاع مشترک شکننده است.
اشتباه رایج
❌ استخراج زودهنگام یک Base Handler یا Service مشترک بین چند Slice بهمحض دیدن دو خط تکراری — این کار دقیقاً همان اتصال بین Featureها را برمیگرداند که Vertical Slice قصد حذفش را دارد.
خلاصه
Vertical Slice Architecture کد را بر اساس هر Feature بهصورت عمودی و مستقل سازماندهی میکند، نه بر اساس لایههای افقی مشترک. هر Slice شامل تمام چیزی است که برای اجرای همان Use Case لازم است. تکرار کوچک بین Sliceها بهتر از یک انتزاع مشترک شکننده پذیرفته میشود.
