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

C# 設計模式實戰:Abstract Factory 抽象工廠模式在 ADO.NET 中的應用(三)

     編輯:關於C語言

.NET Framework 內建抽象工廠:DbProviderFactory

ADO.NET 2.0 完整實作抽象工廠模式,解決多資料庫存取的系列產品建立問題:

抽象工廠基類

public abstract class DbProviderFactory
{
    protected DbProviderFactory() { }

    public virtual DbCommand CreateCommand() => null;
    public virtual DbCommandBuilder CreateCommandBuilder() => null;
    public virtual DbConnection CreateConnection() => null;
    public virtual DbConnectionStringBuilder CreateConnectionStringBuilder() => null;
    public virtual DbDataAdapter CreateDataAdapter() => null;
    public virtual DbDataSourceEnumerator CreateDataSourceEnumerator() => null;
    public virtual DbParameter CreateParameter() => null;
    public virtual CodeAccessPermission CreatePermission(PermissionState state) => null;

    public virtual bool CanCreateDataSourceEnumerator => false;
}

具體工廠:OleDbFactory (Access)


public sealed class OleDbFactory : DbProviderFactory
{
    public static readonly OleDbFactory Instance = new OleDbFactory();
    private OleDbFactory() { }

    public override DbCommand CreateCommand() => new OleDbCommand();
    public override DbCommandBuilder CreateCommandBuilder() => new OleDbCommandBuilder();
    public override DbConnection CreateConnection() => new OleDbConnection();
    public override DbConnectionStringBuilder CreateConnectionStringBuilder() => new OleDbConnectionStringBuilder();
    public override DbDataAdapter CreateDataAdapter() => new OleDbDataAdapter();
    public override DbParameter CreateParameter() => new OleDbParameter();
    public override CodeAccessPermission CreatePermission(PermissionState state) => new OleDbPermission(state);
}

具體工廠:SqlClientFactory (SQL Server)


public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider
{
    public static readonly SqlClientFactory Instance = new SqlClientFactory();
    private SqlClientFactory() { }

    public override DbCommand CreateCommand() => new SqlCommand();
    public override DbCommandBuilder CreateCommandBuilder() => new SqlCommandBuilder();
    public override DbConnection CreateConnection() => new SqlConnection();
    public override DbConnectionStringBuilder CreateConnectionStringBuilder() => new SqlConnectionStringBuilder();
    public override DbDataAdapter CreateDataAdapter() => new SqlDataAdapter();
    public override DbDataSourceEnumerator CreateDataSourceEnumerator() => SqlDataSourceEnumerator.Instance;
    public override DbParameter CreateParameter() => new SqlParameter();
    public override CodeAccessPermission CreatePermission(PermissionState state) => new SqlClientPermission(state);

    object IServiceProvider.GetService(Type serviceType) { /* 內部實作 */ }

    public override bool CanCreateDataSourceEnumerator => true;
}

實務應用優勢

  • 客戶端代碼僅依賴 DbProviderFactory 抽象介面
  • 切換資料庫只需更換工廠實例,零修改業務邏輯
  • 系列產品(Connection、Command、DataAdapter 等)保證相容性
  • 新增資料庫支援只需實作新的 Factory,符合開閉原則

使用範例


DbProviderFactory factory = SqlClientFactory.Instance; // 或 OleDbFactory.Instance
using (DbConnection conn = factory.CreateConnection())
{
    conn.ConnectionString = config.ConnectionString;
    using (DbCommand cmd = factory.CreateCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "SELECT * FROM Users";
        using (DbDataAdapter adapter = factory.CreateDataAdapter())
        {
            adapter.SelectCommand = cmd;
            DataTable dt = new DataTable();
            adapter.Fill(dt);
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved