經典三層架構 (Presentation / BLL / DAL) 配合工廠模式解耦介面與實作。本文以一個具體查詢請求,追蹤完整呼叫鏈路與資料流向。
Web (UI) → BLL (Business Logic) → IDAL (Interface) → Factory (工廠) → DAL (SQL Server 實作) → SQLHelper → Model (Entity)
IDAL 介面實例,呼叫資料存取方法。web.config 組態字串 (如 DAL=MyApp.DAL.SqlServer.UserDAL),Assembly.Load + CreateInstance 動態建立具體 DAL 物件,回傳 IDAL 介面。SQLHelper.ExecuteReader 取得 SqlDataReader。SqlConnection、SqlCommand、SqlParameter,執行查詢回傳 SqlDataReader。reader.Read(),將欄位值填入 Model 實體屬性,加入 List<Model> 回傳。// Web 層
int userId = Convert.ToInt32(Request["id"]);
UserBLL bll = new UserBLL();
UserInfo user = bll.GetUserById(userId);
lblName.Text = user.Name;
// BLL 層
public UserInfo GetUserById(int id)
{
IUserDAL dal = DataFactory.CreateUserDAL(); // 工廠
return dal.GetUserById(id);
}
// 工廠層
public static IUserDAL CreateUserDAL()
{
string path = ConfigurationManager.AppSettings["UserDALPath"]; // "MyApp.DAL.SqlServer.UserDAL, MyApp.DAL"
return (IUserDAL)Assembly.Load(path.Split(',')[1]).CreateInstance(path.Split(',')[0]);
}
// DAL 層 (SQL Server 實作)
public UserInfo GetUserById(int id)
{
string sql = "SELECT * FROM Users WHERE Id=@Id";
SqlParameter p = new SqlParameter("@Id", id);
using (SqlDataReader dr = SQLHelper.ExecuteReader(sql, p))
{
if (dr.Read())
return MapToModel(dr);
}
return null;
}
private UserInfo MapToModel(SqlDataReader dr)
{
return new UserInfo { Id = (int)dr["Id"], Name = (string)dr["Name"], Email = (string)dr["Email"] };
}
雖現代架構傾向 Repository + UnitOfWork + ORM (EF Core/Dapper),但三層核心思想仍是企業級 .NET 系統設計的基石。