使用設計模式構建通用資料庫訪問類(外摘)

來源:互聯網
上載者:User
在應用程式的設計中,資料庫的訪問是非常重要的,我們通常需要將對資料庫的訪問集中起來,以保證良好的封裝性和可維護性。在.Net中,資料庫的訪問,對於微軟自家的SqlServer和其他資料庫(支援OleDb),採用不同的存取方法,這些類分別分佈於System.Data.SqlClient和System.Data.OleDb名稱空間中。微軟後來又推出了專門用於訪問Oracle資料庫的類庫。我們希望在編寫應用系統的時候,不因這麼多類的不同而受到影響,能夠盡量做到資料庫無關,當後台資料庫發生變更的時候,不需要更改用戶端的代碼。

   這就需要我們在實際開發過程中將這些資料庫訪問類再作一次封裝。經過這樣的封裝,不僅可以達到上述的目標,還可以減少操作資料庫的步驟,減少代碼編寫量。在這個方面,微軟為我們提供了Application Block,但是,可惜的是目前只支援Sql Server。這裡,介紹一種在實際應用中得到了非常好的效果的實作策略——筆者編寫的Websharp架構中的資料訪問結構。Factory設計模式是使用的主要方法。

   我們先來看看Factory的含義:定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory Method使一個類的執行個體化延遲到其子類。我們這裡可能會處理對多種資料庫的操作,因此,需要首先定義一個操縱資料庫的介面,然後,根據資料庫的不同,由類工廠決定執行個體化哪個類。

   下面,我們首先來定義這個提供者。為了方便說明問題,我們在這裡只列出了比較少的方法,其他的方法是很容易參照添加的。

public interface DataAccess
{
  DatabaseType DatabaseType{get;} //資料庫類型
  IDbConnection DbConnection{get;} //得到資料庫連接
  void Open(); //開啟資料庫連接
  void Close(); //關閉資料庫連接

  IDbTransaction BeginTransaction(); //開始一個事務
  int ExecuteNonQuery(string commandText); //執行Sql語句
  DataSet ExecuteDataset(string commandText);//執行Sql,返回DataSet
}

   因為,DataAccess的具體實作類別有一些共同的方法,所以,先從DataAccess實現一個抽象的AbstractDataAccess類,包含一些公用方法。然後,我們分別為Sql Server、Oracle和OleDb資料庫編寫三個資料訪問的具體實作類別:

public sealed class MSSqlDataAccess : AbstractDataAccess
{
  ……//具體實現代碼。
}

public class OleDbDataAccess : AbstractDataAccess
{
  ……//具體實現代碼。
}

public class OracleDataAccess : AbstractDataAccess
{
  ……//具體實現代碼。
}

   現在我們已經完成了所要的功能,下面,我們需要建立一個Factory類,來實現自動資料庫切換的管理。這個類很簡單,主要的功能就是根據資料庫類型,返回適當的資料庫操縱類。

public sealed class DataAccessFactory
{
  private DataAccessFactory(){}
  private static PersistenceProperty defaultPersistenceProperty;
  public static PersistenceProperty DefaultPersistenceProperty
  {
   get{return defaultPersistenceProperty;}
   set{defaultPersistenceProperty=value;}
  }

public static DataAccess CreateDataAccess(PersistenceProperty pp)
{
  DataAccess dataAccess;
  switch(pp.DatabaseType)
  {
   case(DatabaseType.MSSQLServer):
    dataAccess = new MSSqlDataAccess(pp.ConnectionString);
    break;
   case(DatabaseType.Oracle):
    dataAccess = new OracleDataAccess(pp.ConnectionString);
    break;
   case(DatabaseType.OleDBSupported):
    dataAccess = new OleDbDataAccess(pp.ConnectionString);
    break;
   default:
    dataAccess=new MSSqlDataAccess(pp.ConnectionString);
    break;
  }
  return dataAccess;
}

public static DataAccess CreateDataAccess()
{
  return CreateDataAccess(defaultPersistenceProperty);
}

}

   好了,現在,一切都完成了,用戶端在代碼調用的時候,可能就是採用如下形式:

PersistenceProperty pp = new PersistenceProperty();
pp.ConnectionString = "server=127.0.0.1;uid=sa;pwd=;database=Northwind;";
pp.DatabaseType = DatabaseType. MSSQLServer;
pp.UserID = “sa”;
pp.Password = “”;
DataAccess db= DataAccessFactory.CreateDataAccess(pp)
db.Open();
……//db.需要的操作
db.Close();

   或者,如果事先設定了DataAccessFactory的DefaultPersistenceProperty屬性,可以直接使用
DataAccess db= DataAccessFactory.CreateDataAccess()方法建立DataAccess執行個體。

   當資料庫發生變化的時候,只需要修改PersistenceProperty的值,用戶端不會感覺到變化,也不用去關心。這樣,實現了良好的封裝性。當然,前提是,你在編寫程式的時候,沒有用到特定資料庫的特性,例如,Sql Server的專用函數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.