架構分層
| 層級 | 專案/命名空間 | 職責 | 關鍵類別 |
| 表示層 | Maticsoft.Web | 頁面呈現、使用者互動、輸入驗證 | MYAdd.aspx / MYAdd.aspx.cs |
| 業務邏輯層 | Maticsoft.BLL | 業務規則、流程控制、交易協調 | EmployeesBLL |
| 資料存取層 | Maticsoft.DAL | SQL 執行、參數化、連線管理 | EmployeesDAL |
| 實體模型 | Maticsoft.Model | 資料傳輸物件 (DTO) | EmployeesInfo |
實體模型
namespace Maticsoft.Model
{
public class EmployeesInfo
{
public int EmployeeID { get; set; }
public string EmployeesName { get; set; }
// 其他欄位...
}
}
資料存取層
namespace Maticsoft.DAL
{
public class EmployeesDAL
{
public bool Add(EmployeesInfo model)
{
StringBuilder sql = new StringBuilder();
sql.Append("INSERT INTO Employees (EmployeeID, EmployeesName) VALUES (@EmployeeID, @EmployeesName)");
SqlParameter[] paras =
{
new SqlParameter("@EmployeeID", SqlDbType.Int) { Value = model.EmployeeID },
new SqlParameter("@EmployeesName", SqlDbType.VarChar, 90) { Value = model.EmployeesName }
};
return DbHelperSQL.ExecuteSql(sql.ToString(), paras) > 0;
}
}
}
業務邏輯層
namespace Maticsoft.BLL
{
public class EmployeesBLL
{
private readonly EmployeesDAL _dal = new EmployeesDAL();
public bool Add(EmployeesInfo model)
{
// 這裡可加入業務規則:唯一性檢查、權限驗證、寫入日誌、發送通知等
return _dal.Add(model);
}
}
}
表示層:新增頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MYAdd.aspx.cs" Inherits="Maticsoft.Web.Employees.MYAdd" %>
<form id="form1" runat="server">
員工編號:<asp:TextBox ID="txtEmpID" runat="server" />
<asp:RequiredFieldValidator ControlToValidate="txtEmpID" ErrorMessage="編號必填" runat="server" />
<asp:RegularExpressionValidator ControlToValidate="txtEmpID" ValidationExpression="^\d+$" ErrorMessage="需為數字" runat="server" />
員工姓名:<asp:TextBox ID="txtEmpName" runat="server" />
<asp:RequiredFieldValidator ControlToValidate="txtEmpName" ErrorMessage="姓名必填" runat="server" />
<asp:Button ID="btnSave" runat="server" Text="儲存" OnClick="btnSave_Click" />
<asp:Button ID="btnCancel" runat="server" Text="返回" OnClick="btnCancel_Click" />
</form>
表示層:代碼後置
namespace Maticsoft.Web.Employees
{
public partial class MYAdd : Page
{
private readonly EmployeesBLL _bll = new EmployeesBLL();
protected void btnSave_Click(object sender, EventArgs e)
{
if (!Page.IsValid) return;
var model = new EmployeesInfo
{
EmployeeID = int.Parse(txtEmpID.Text),
EmployeesName = txtEmpName.Text.Trim()
};
if (_bll.Add(model))
{
MessageBox.ShowAndRedirect(this, "儲存成功!", "MYAdd.aspx");
}
else
{
MessageBox.Show(this, "儲存失敗,請稍後再試。");
}
}
protected void btnCancel_Click(object sender, EventArgs e)
{
Response.Redirect("List.aspx");
}
}
}
分層優勢
- 關注點分離:UI 不含 SQL,DAL 不含業務規則,易於單元測試與替換實作。
- 複用性:BLL 可被 Web、WebAPI、Windows Service、Console 共同呼叫。
- 維護性:修改資料庫結構只需動 DAL;修改業務流程只動 BLL。
- 團隊協作:前端/後端/DBA 可平行開發,介面由 Model 定義。
進階擴充
- 導入 **Repository Pattern + Unit of Work** 統一交易控制。
- 使用 **AutoMapper** 實現 Model ↔ ViewModel 映射。
- 採用 **Dependency Injection** (Autofac/內建 DI) 解耦 BLL 對 DAL 的具體依賴。
- 加入 **快取層** (Redis/MemoryCache) 於 BLL 降低資料庫壓力。