首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

基於 LINQ to SQL 的三層式 Web 架構實戰:從 DBML 產生到 BLL/DAL 分層

     編輯:關於.NET

前言

LINQ to SQL 透過 `.dbml` 設計師將資料庫結構自動對應為實體類別,徹底改變傳統三層架構中「手寫 Model、手寫 DAL」的痛點。本文以 Northwind 資料庫為例,完整示範:建立方案結構、DBML 產生實體與 DataContext、DAL 封裝 LINQ 查詢、BLL 傳遞查詢條件、Web Form 繫結 GridView,並分析架構優缺點與改進方向。

一、方案結構規劃

Solution: LinqThreeTier
├── WebApplication (ASP.NET Web Application)  // 表現層
├── DAL (Class Library)                        // 資料存取層 + DBML
└── BLL (Class Library)                        // 業務邏輯層

方案總管結構

二、DAL 專案:DBML 產生與調整

2.1 拖曳資料表產生實體

  • 專案加入 LINQ to SQL Classes → `Northwind.dbml`
  • Server Explorer 連線 Northwind → 拖曳 `Employees` 表至設計師
  • 自動產生 `NorthwindDataContext`、`Employee` 實體類別

DBML 設計師

2.2 統一連線字串至 Web.config

// NorthwindDataContext 建構子修改
public NorthwindDataContext()
    : base(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString, mappingSource)
{
    OnCreated();
}
  • 專案加入參考 `System.Configuration`
  • Web.config 設定 ``,避免連線字串分散在 `app.config`

2.3 命名空間統一

將自動產生程式碼的 `namespace DAL` 改為 `Auto.DAL`,方便跨層引用。

三、DAL 類別:封裝 LINQ 查詢

namespace Auto.DAL
{
    public class DALEmployees
    {
        private readonly NorthwindDataContext _db = new NorthwindDataContext();

        /// 依城市取得員工清單
        public IQueryable<Employee> GetList(string city)
        {
            return from e in _db.Employees
                   where e.City == city
                   select e;
        }
    }
}
  • 回傳 `IQueryable<T>` 利用延遲執行,由上層決定 `ToList()`、`Count()` 等實體化時機
  • 單一職責:僅封裝資料存取邏輯,不含業務規則

四、BLL 類別:業務邏輯與參數傳遞

namespace Auto.BLL
{
    public class BLLEmployees
    {
        public IQueryable<Employee> GetList(string city)
        {
            var dal = new DALEmployees();
            return dal.GetList(city); // 透傳參數
        }
    }
}
  • 目前僅單純轉呼叫,實務上可加入驗證、快取、交易、多 DAL 協調等業務規則
  • 參數型別建議使用強型別 DTO,而非單純 `string`,提升型別安全

五、表現層:Web Form 繫結

5.1 Default.aspx

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true" />

5.2 Default.aspx.cs

using Auto.BLL;

namespace WebApplication
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack) GetList("London");
        }

        private void GetList(string city)
        {
            var bll = new BLLEmployees();
            GridView1.DataSource = bll.GetList(city);
            GridView1.DataBind();
        }
    }
}

5.3 執行結果

架構圖與執行畫面

六、架構優缺點分析

優點缺點/改進
DBML 自動產生 Model + DAL 基礎,開發極快 參數傳遞仍用基本型別,缺乏 DTO 封裝
LINQ 強型別、IntelliSense、編譯期檢查 DAL 直接 `new DataContext()`,缺乏連線/交易管理(建議注入或 UnitOfWork)
延遲執行 `IQueryable` 彈性組合查詢 實體類別耦合資料表結構,跨層傳遞易洩露持久化細節
資料表變更僅需更新 DBML,自動同步 未展示 Repository 模式,測試性較弱

七、改進路線圖

  1. 導入 Repository + UnitOfWork:抽象 `IEmployeeRepository`,控制 `DataContext` 生命週期
  2. DTO/ViewModel 分離:BLL 回傳 `EmployeeDto`,切斷實體與 UI 耦合
  3. 依賴注入:Unity/Autofac 管理 DAL/BLL 實例,支援單元測試 Mock
  4. 結合 ASP.NET MVC:Controller 取代 Code-Behind,Action 回傳 `JsonResult`/`ViewResult`
  5. 遷移至 Entity Framework Core:跨平台、效能更優、支援 NoSQL/記憶體資料庫

結語

LINQ to SQL + DBML 讓三層架構落地變得前所未有的輕鬆,適合中小型專案快速原型。隨著系統增長,建議逐步導入 Repository、DTO、DI 等模式,平滑演進至現代化架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved