برنامه نویسی

معماری لایه ای در ASP.NET CORE: ساده ، ساختار یافته و هنوز هم مرتبط است (قسمت 2)

در بخش اول این سری ، ما بررسی کردیم که چرا معماری نرم افزار اهمیت دارد – به ویژه در پروژه های .NET که فراتر از برنامه های ساده CRUD رشد می کند.

امروز ، ما با یکی از آشنا ترین الگوهای: معماری لایه ای شروع می کنیم. این اغلب اولین رویکرد ساختاری است که توسعه دهندگان یاد می گیرند – و با دلیل خوب. این شفافیت و جدایی نگرانی ها را بدون سربار زیاد به ارمغان می آورد.

بیایید آن را تجزیه کنیم.

معماری لایه ای چیست؟

معماری لایه ای ، همچنین به عنوان معماری N-stier شناخته می شود ، برنامه خود را به لایه های منطقی جدا می کند که در آن هر لایه مسئولیت خاصی دارد.

یک پروژه اصلی ASP.NET با استفاده از این الگوی شامل موارد زیر است:

لایه ارائه (به عنوان مثال ، کنترل کننده ها ، صفحات تیغ ، API)

لایه برنامه (به عنوان مثال ، خدمات ، منطق تجارت)

لایه دسترسی به داده ها (به عنوان مثال ، مخازن ، هسته EF)

لایه دامنه (اختیاری ، برای مدل های اصلی و منطق)

+-----------------------+
|   Presentation Layer  |
|  (Controllers / API)  |
+-----------------------+
           ↓
+-----------------------+
|   Application Layer   |
| (Services / Use Cases)|
+-----------------------+
           ↓
+-----------------------+
|   Data Access Layer   |
|   (EF Core / DB Code) |
+-----------------------+
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

هر لایه فقط با لایه مستقیماً در زیر آن صحبت می کند.

چرا از معماری لایه ای استفاده می کنیم؟

✅ جدایی نگرانی ها
✅ قابلیت حفظ را بهبود می بخشد
✅ آزمایش را ساده می کند (به خصوص منطق سرویس)
✅ در آموزش ها ، تیم ها و ابزار پشتیبانی خوب پشتیبانی می شود

این به شما کمک می کند تا با فشار دادن منطق به جای مناسب ، از مشکلات “کنترل کننده خدا” یا “سرویس چربی” جلوگیری کنید.

اشتباهات رایج

با وجود سادگی ، توسعه دهندگان اغلب از این الگوی سوء استفاده می کنند:

❌ پرش از لایه برنامه ، قرار دادن منطق در کنترلرها

❌ خدماتی که فقط به پایگاه داده فراخوانی می کنند

❌ اتصال محکم بین لایه ها

❌ نادیده گرفتن اعتبار و قوانین تجاری

🛠 یک مثال ساده در هسته ASP.NET

بیایید بگوییم که ما در حال ساخت یک سیستم سفارش اساسی هستیم.

1 مدل دامنه

public class Order
{
    public Guid Id { get; set; }
    public DateTime CreatedAt { get; set; }
    public decimal TotalAmount { get; set; }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

2 لایه برنامه

 public interface IOrderService
{
    Task CreateOrderAsync(OrderDto dto);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

public class OrderService : IOrderService
{
    private readonly IOrderRepository _repository;

    public OrderService(IOrderRepository repository)
    {
        _repository = repository;
    }

    public async Task CreateOrderAsync(OrderDto dto)
    {
        var order = new Order
        {
            Id = Guid.NewGuid(),
            CreatedAt = DateTime.UtcNow,
            TotalAmount = dto.Total
        };

        await _repository.AddAsync(order);
        return order.Id;
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

3 لایه دسترسی به داده ها

public interface IOrderRepository
{
    Task AddAsync(Order order);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

public class OrderRepository : IOrderRepository
{
    private readonly AppDbContext _context;

    public OrderRepository(AppDbContext context)
    {
        _context = context;
    }

    public async Task AddAsync(Order order)
    {
        _context.Orders.Add(order);
        await _context.SaveChangesAsync();
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

4 لایه ارائه (کنترل کننده)

[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
    private readonly IOrderService _orderService;

    public OrdersController(IOrderService orderService)
    {
        _orderService = orderService;
    }

    [HttpPost]
    public async Task CreateOrder([FromBody] OrderDto dto)
    {
        var id = await _orderService.CreateOrderAsync(dto);
        return Ok(id);
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ساخت پوشه

/MyApp
  /Controllers
    OrdersController.cs
  /Services
    IOrderService.cs
    OrderService.cs
  /Repositories
    IOrderRepository.cs
    OrderRepository.cs
  /Models
    Order.cs
    OrderDto.cs
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

آیا معماری لایه ای هنوز مرتبط است؟

بله – اما با ظرافت.

برای برنامه های کوچک و متوسط ​​، بسیار عالی کار می کند. برای دامنه های پیچیده یا تیم های بزرگ ، ممکن است به پیشرفت هایی مانند:

  • CQRS

  • عرفان

  • پیاز/معماری تمیز

نکته اصلی درک وقتی کافی است – و چه موقع نیاز به تکامل دارید.

چه موقع از این الگوی استفاده کنید

✅ MVPS یا محصولات راه اندازی
✅ ابزارهای داخلی
✅ پروژه هایی که پیچیدگی متوسط ​​است
✅ تیم های جدید در الگوهای معماری

بعد

در قسمت 3 ، ما تا معماری پیاز را سطح می کنیم – یک ساختار انعطاف پذیر تر که وابستگی ها به سمت داخل جریان می یابند ، نه به بیرون.

اگر معماری لایه ای اولین قدم شما برای طراحی کد تمیز باشد ، معماری پیاز دوم است.

بسته بندی

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

با تشکر از شما برای دنبال کردن!

مانند ، اظهار نظر کنید ، یا به زودی قسمت 3 را دنبال کنید.
س questions ال دارید یا از این در تولید استفاده می کنید؟ بیایید در نظرات بحث کنیم!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا