初學 ASP.NET MVC 時常見困惑:MVC 已經分離了 Model、View、Controller,為何項目中還要建立 BLL(業務邏輯層)和 DAL(數據訪問層)?它們之間是什麼關係?
| 層級 | 職責 | 典型技術 |
|---|---|---|
| UI 層 (MVC) | 處理 HTTP 請求/響應、視圖渲染、用戶交互 | Controller、View、ViewModel |
| BLL (業務邏輯層) | 封裝業務規則、事務管理、驗證邏輯、工作流協調 | Service 類、DTO、領域模型 |
| DAL (數據訪問層) | CRUD 操作、SQL 執行、ORM 映射、連接管理 | Entity Framework、Dapper、ADO.NET |
// Controller (UI層)
public class OrderController : Controller {
private readonly IOrderService _orderService; // 依賴 BLL 接口
public OrderController(IOrderService orderService) {
_orderService = orderService;
}
public ActionResult Create(OrderDTO dto) {
_orderService.PlaceOrder(dto); // 調用 BLL
return Json(new { Success = true });
}
}
// OrderService (BLL層)
public class OrderService : IOrderService {
private readonly IOrderRepository _repo; // 依賴 DAL 接口
public void PlaceOrder(OrderDTO dto) {
// 1. 業務驗證
// 2. 領域模型構建
// 3. 事務控制
using (var tx = new TransactionScope()) {
_repo.Add(order); // 調用 DAL
_repo.UpdateStock(dto.Items);
tx.Complete();
}
}
}
// OrderRepository (DAL層)
public class OrderRepository : IOrderRepository {
private readonly DbContext _db;
public void Add(Order order) => _db.Orders.Add(order);
public void UpdateStock(List items) { /* 批量更新庫存 */ }
}
MVC 與三層架構不衝突、不重複、互補。MVC 負責「外部交互」,三層架構管好「內部邏輯」。理解這一點,是從「寫代碼」進階為「做架構」的關鍵一步。