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

.NET 多資料庫架構實戰:工廠模式 + 反射實現零修改切換 SQL Server/Oracle/MySQL

     編輯:關於.NET

早期專案若需支援多資料庫(SQL Server → Oracle → MySQL),往往面臨大量程式碼重寫的惡夢。資料工廠模式結合反射機制,讓資料存取層(DAL)實現真正的「零程式碼修改、零重新編譯、單純部署 DLL」的無縫切換。本文以經典 PetShop 3.0 架構為藍本,完整解析實作細節。

核心架構圖解

┌─────────────┐     介面契約      ┌──────────────────┐
│  BLL 業務層  │ ◄──────────────► │ IDAL 介面組件    │
└─────────────┘   (ICategory等)  └────────┬─────────┘
                                          │
                    ┌─────────────────────┼─────────────────────┐
                    ▼                     ▼                     ▼
           ┌─────────────────┐   ┌─────────────────┐   ┌─────────────────┐
           │ SQLServerDAL.dll │   │ OracleDAL.dll   │   │ MySqlDAL.dll    │
           │ 實作 IDAL 介面   │   │ 實作 IDAL 介面   │   │ 實作 IDAL 介面   │
           └────────┬────────┘   └────────┬────────┘   └────────┬────────┘
                    │                     │                     │
                    └─────────────────────┼─────────────────────┘
                                          ▼
                               ┌─────────────────────┐
                               │ DALFactory 工廠類   │
                               │ 反射動態建立實例    │
                               └─────────────────────┘

關鍵組件實作詳解

1. 介面契約層 (IDAL) - 穩定不變的契約

namespace PetShop.IDAL
{
    public interface ICategory
    {
        IList GetCategories();
        CategoryInfo GetCategory(string categoryId);
        void InsertCategory(CategoryInfo category);
        // ... 其他業務方法
    }
}

2. 具體實作層 - 多資料庫平行實作

每個資料庫專案結構相同,僅實作細節不同:

// PetShop.SQLServerDAL/Category.cs
namespace PetShop.SQLServerDAL
{
    public class Category : IDAL.ICategory
    {
        // SQL Server 專用 T-SQL、SqlClient 實作
    }
}

// PetShop.OracleDAL/Category.cs  
namespace PetShop.OracleDAL
{
    public class Category : IDAL.ICategory
    {
        // Oracle 專用 PL/SQL、OracleClient 實作
    }
}

3. 組態驅動:web.config 切換開關

<appSettings>
  <!-- 切換資料庫只需修改此處 -->
  <add key="WebDAL" value="PetShop.SQLServerDAL" />
  <add key="OrdersDAL" value="PetShop.SQLServerDAL" />
  
  <!-- 切換至 Oracle -->
  <!-- <add key="WebDAL" value="PetShop.OracleDAL" /> -->
  <!-- <add key="OrdersDAL" value="PetShop.OracleDAL" /> -->
  
  <!-- 切換至 MySQL -->
  <!-- <add key="WebDAL" value="PetShop.MySqlDAL" /> -->
</appSettings>

4. 工廠核心:反射動態建立實例

namespace PetShop.DALFactory
{
    public sealed class DataAccess
    {
        private static readonly string _dalPath = ConfigurationManager.AppSettings["WebDAL"];
        
        public static IDAL.ICategory CreateCategory()
        {
            string className = _dalPath + ".Category";  // 如 "PetShop.SQLServerDAL.Category"
            // 反射載入組件並建立實例,回傳介面型別
            return (IDAL.ICategory)Assembly.Load(_dalPath).CreateInstance(className);
        }
        
        // 其他 CreateXxx 方法同理...
    }
}

5. 業務層 (BLL) 完全解耦具體實作

namespace PetShop.BLL
{
    public class Category
    {
        private static readonly IDAL.ICategory _dal = DALFactory.DataAccess.CreateCategory();
        
        public IList GetCategories()
        {
            return _dal.GetCategories();  // 僅呼叫介面方法
        }
    }
}

擴充新資料庫:MySQL 實戰演練

  1. 建立 PetShop.MySqlDAL 專案,參考 PetShop.IDAL 並實作所有介面
  2. 編譯產生 PetShop.MySqlDAL.dll 部署至 Bin 目錄
  3. 修改 web.config:<add key="WebDAL" value="PetShop.MySqlDAL" />
  4. 零程式碼修改、零重新編譯、零停機部署完成切換

為何不用 switch-case 工廠?

// 反模式:違反開放封閉原則
switch (webDal)
{
    case "SQLServerDAL": return new SqlServerDALFactory();
    case "OracleDAL": return new OracleDALFactory();
    case "MySqlDAL": return new MySqlDALFactory();  // 新增資料庫必須修改此處並重新編譯
    default: return new SqlServerDALFactory();
}

反射工廠優勢:新增資料庫只需新增 DLL + 修改組態,既有程式碼完全不動,完美符合開放封閉原則(OCP)。

企業級落地建議

  • 介面隔離:IDAL 獨立組件,BLL 僅參考 IDAL,不參考具體 DAL
  • 依賴注入升級:.NET Core 內建 DI 容器可替代手工工廠,原理相同
  • 連線字串管理:搭配 connectionStrings 區段,不同資料庫獨立維護連線資訊
  • 測試替身:單元測試時注入 Mock DAL,無需真實資料庫

此架構已在無數企業級產品驗證,是 .NET 多資料庫支援的黃金標準模式。

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