首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

基於 CodeSmith 的 MVC 開發框架設計:實體類與資料存取層自動生成實作

     編輯:關於SqlServer

框架定位與技術棧

  • 目標:針對 SQL Server 2000,利用 CodeSmith 模板引擎自動生成 Model (實體類) 與 DAL (資料存取層) 基礎 CRUD 程式碼
  • 核心組件:
    • SchemaExplorer:讀取資料庫結構描述
    • CodeSmith.CustomProperties:擴充屬性編輯器
    • DalCode.dll:自訂程式碼邏輯組件,封裝欄位篩選、型別轉換、SQL 片段生成

核心程式碼組件:DalCode.cs

職責

封裝「根據 TableSchema 產生 Insert/Delete/Update/Select 所需參數集合」的邏輯,供 .cst 模板呼叫。

關鍵方法

方法用途核心邏輯
GetInsertParm()INSERT 參數排除 Identity 欄位、有預設值欄位
GetDeleteParm()DELETE 參數僅包含 Identity 欄位 (主鍵)
GetUpdateParm()UPDATE 參數排除 Identity 欄位,其餘全部
GetSelectParm()SELECT 參數僅包含 Identity 欄位 (主鍵查詢)
IsIdentity()判斷 Identity讀取 ExtendedProperties["CS_IsIdentity"]
IsDefault()判斷有無預設值檢查 ExtendedProperties["CS_Default"]
ToSQLType()型別映射AnsiString → SqlDbType.VarChar,其餘直轉

CodeSmith 模板:dal.cst

模板參數宣告

<%@ Property Name="Table" Type="SchemaExplorer.TableSchema" Category="Context" %>
<%@ Property Name="NameSpace" Type="System.String" Default="Company.Product.Module" %>
<%@ Property Name="ClassName" Type="System.String" Default="ClassName" %>
<%@ Property Name="ModelType" Type="System.String" Default="ModelType" %>
<%@ Property Name="ModelName" Type="System.String" Default="ModelName" %>
<%@ Property Name="InsertParm" Type="CodeSmith.CustomProperties.NameValueCollection" %>
<%@ Property Name="DeleteParm" Type="CodeSmith.CustomProperties.NameValueCollection" %>
<%@ Property Name="UpdateParm" Type="CodeSmith.CustomProperties.NameValueCollection" %>
<%@ Property Name="SelectParm" Type="CodeSmith.CustomProperties.NameValueCollection" %>

模板執行流程

  1. 實例化 DalCode dal = new DalCode(Table)
  2. 呼叫 GetInsertParm() 等方法填充參數集合屬性
  3. 在 `<% %>` 程式碼區塊構建 SQL 字串常數:
private const string SQL_INSERT_TOPIC = "INSERT INTO <%=Table.Name%> (<%=InsertName%>) VALUES(<%=InsertValue%>)";
private const string SQL_DELETE_TOPIC = "DELETE FROM <%=Table.Name%> WHERE <%=DeleteParm[0].Key%> = @<%=DeleteParm[0].Key%>";
private const string SQL_UPDATE_TOPIC = "UPDATE <%=Table.Name%> SET <%=UpdateString%> WHERE <%=DeleteParm[0].Key%> = @<%=DeleteParm[0].Key%>";
private const string SQL_SELECT_TOPIC = "SELECT * FROM <%=Table.Name%> WHERE <%=SelectParm[0].Key%> = @<%=SelectParm[0].Key%>";

生成的 DAL 類別結構

  • Insert(Model):建立 SqlParameter 陣列 → 填值 → SQLHelper.ExecuteNonQuery
  • GetInsertParameters():快取參數陣列 (SQLHelper.GetCachedParameters/CacheParameters),避免重複建立
  • 同理生成 Delete、Update、Select 方法

SQLHelper 輔助類 (需專案自備)

public static class SQLHelper
{
    public static string CONN_STRING_NON_DTC = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
    
    public static int ExecuteNonQuery(string connStr, CommandType type, string sql, SqlParameter[] parms) { ... }
    
    private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable());
    public static SqlParameter[] GetCachedParameters(string cacheKey) { ... }
    public static void CacheParameters(string cacheKey, SqlParameter[] parms) { ... }
}

擴充方向與現代化建議

現狀 (2008 時代)現代化替代 (2024+)
CodeSmith 模板生成 .cs 檔T4 模板 / Source Generators (Roslyn) / EF Core Scaffold-DbContext
手寫 SQL + SqlParameterDapper / EF Core / RepoDb - 微型 ORM
SQLHelper 快取參數Dapper 內建參數快取 / EF Core 編譯查詢快取
單表 CRUDRepository Pattern + Unit of Work / CQRS
SQL Server 2000 目標.NET 6+ / SQL Server 2019+ / Linux 容器化部署

遷移路徑建議

  1. 保留既有 CodeSmith 模板產出的 DAL 程式碼作為基準測試基準
  2. 引入 Dapper 逐步替換 SQLHelper 呼叫,享受物件映射與參數快取
  3. 新功能採用 EF Core Code First,舊功能以 Strangler Fig 模式逐步重構
  4. 建立 整合測試套件 驗證 DAL 行為一致性,確保重構無回歸

結語

CodeSmith 在 2000 年代為 .NET 開發帶來極大生產力提升,其「Schema 驅動生成」思想延續至今日的 Source Generators、EF Core Scaffolding、OpenAPI 生成器等工具。理解早期框架的生成邏輯(欄位篩選、型別映射、SQL 片段組裝、參數快取),有助於評估現代 ORM 的設計取捨與效能特徵。

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