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

Castle ActiveRecord 組態封裝方案:工廠模式實現多資料庫通用初始化

     編輯:關於.NET

痛點:重複的組態字串難維護

每個專案都要在 web.config 或程式碼中重複寫入 hibernate.connection.driver_class、dialect、connection_string 等鍵值,易出錯且難以切換資料庫。

解決方案:工廠模式封裝初始化邏輯

1. 定義抽象初始化介面

public abstract class ActiveRecordInitializer
{
    public abstract void Initialize(string databaseName, string modelAssembly);
}

2. 實作不同資料庫的具體初始化類別

public class SqlServerInitializer : ActiveRecordInitializer
{
    public override void Initialize(string databaseName, string modelAssembly)
    {
        var properties = new Hashtable
        {
            ["hibernate.connection.driver_class"] = "NHibernate.Driver.SqlClientDriver",
            ["hibernate.dialect"] = "NHibernate.Dialect.MsSql2000Dialect",
            ["hibernate.connection.provider"] = "NHibernate.Connection.DriverConnectionProvider",
            ["hibernate.connection.connection_string"] =
                $"Data Source=.;Initial Catalog={databaseName};Integrated Security=SSPI"
        };
        var source = new InPlaceConfigurationSource();
        source.Add(typeof(ActiveRecordBase), properties);
        ActiveRecordStarter.Initialize(Assembly.Load(modelAssembly), source);
        ActiveRecordStarter.CreateSchema();
    }
}

public class MySqlInitializer : ActiveRecordInitializer
{
    public override void Initialize(string databaseName, string modelAssembly)
    {
        var properties = new Hashtable
        {
            ["hibernate.connection.driver_class"] = "NHibernate.Driver.MySqlDataDriver",
            ["hibernate.dialect"] = "NHibernate.Dialect.MySQLDialect",
            ["hibernate.connection.provider"] = "NHibernate.Connection.DriverConnectionProvider",
            ["hibernate.connection.connection_string"] =
                $"Server=localhost;Database={databaseName};Uid=root;Pwd=123;CharSet=utf8;"
        };
        var source = new InPlaceConfigurationSource();
        source.Add(typeof(ActiveRecordBase), properties);
        ActiveRecordStarter.Initialize(Assembly.Load(modelAssembly), source);
        ActiveRecordStarter.CreateSchema();
    }
}

3. 工廠類別:根據型別回傳對應初始化器

public static class ActiveRecordFactory
{
    public static ActiveRecordInitializer Create(string dbType)
    {
        return dbType.ToUpper() switch
        {
            "SQL" => new SqlServerInitializer(),
            "MYSQL" => new MySqlInitializer(),
            _ => new SqlServerInitializer()
        };
    }
}

4. 使用方式:一行程式碼完成初始化

// 在 Global.asax Application_Start 中
var initializer = ActiveRecordFactory.Create("SQL"); // 或 "MYSQL"
initializer.Initialize("MyDatabase", "MyProject.Model");

進階擴充建議

  • 將連線字串參數化(Server、UID、PWD 從 appSettings 讀取)。
  • 支援 PostgreSQL、Oracle、SQLite 只需新增對應 Initializer。
  • 生產環境移除 CreateSchema(),改用 FluentMigrator 或 Flyway 管理版本。
  • 搭配 Dependency Injection 容器(如 Windsor)註冊 ActiveRecordInitializer 介面,實現完全解耦。

總結

透過**工廠模式 + 策略模式**封裝 ActiveRecord 初始化邏輯,達到:

  1. 零重複組態:連線參數集中管理。
  2. 多資料庫熱插拔:新增資料庫只需加類別、改工廠。
  3. 測試友善:單元測試可注入 In-Memory SQLite 初始化器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved