我正在設計一個WCF服務,該服務將由數百個客戶端調用,並且我有一個關於數據庫查詢將運行的類的最佳體系結構的問題。今天我只能訪問SQL Server,所以我有一個靜態類,我在內部調用它來完成創建連接和數據收集器的所有骯髒工作。下面是一個簡單的例子:用於數據庫幫助程序類的C#設計模式
namespace DBHelper.Utility
{
public static class SqlDBManager
{
public static void RunSql(String pSql, DBParamsHelper pDBParams, String pConnStringConfigName)
{
String sConnectionString = GetConnectionStringFromConfig(pConnStringConfigName);
SqlConnection oConn = new SqlConnectionsConnectionString
oConn.Open();
try
{
SqlCommand oCommand = new SqlCommand(pSql, oConn);
oCommand.CommandTimeout = 0;
if (pDBManagerParams != null)
{
foreach (SqlParameter sqlParam in pDBManagerParams)
{
oCommand.Parameters.Add(sqlParam);
}
}
oCommand.ExecuteNonQuery();
}
finally
{
oConn.Close();
}
}
}
}
現在,我需要添加對運行Sql Server和Oracle的支持。我最初的想法是聲明一個接口,並讓我現有的SqlDBManager
實現它,然後開發一個實現相同接口的OracleDBManager
。問題是我的類是靜態的,而靜態類不能實現一個接口。我希望我的助手類保持靜態,它更加實用,並且我不必在每次需要運行查詢時都創建一個新對象。我也想過使用類繼承,但是我不能擁有statis虛擬方法,所以在那裏用處不大。我考慮過一些單例實現,所以我不需要創建類,但是在多線程訪問中我會遇到麻煩。
什麼是最好的設計模式,所以我可以在多線程場景(非常重要)上有很好的性能,不需要爲生產效率編寫太多工作代碼(不必創建很多類),並且對於OracleDBManager
都有一個標準方法和SqlDBManager
類?標準方法非常重要,因爲我不希望使用這些助手類的代碼知道它們是否連接到Oracle或Sql Server。
我確實考慮過使用ORM解決方案,比如Entity Framework 4和nHibernate,但是性能影響太大。由於我將運行簡單的查詢,因此PL-SQL和TSQL之間的查詢語法差異將無關緊要。
任何輸入和想法將不勝感激。 TKS
格蘭特,tks給你的建議。這正是我想到的,有一個工廠班和調查員。只是想避免創建對象,但真的不知道是否有辦法...... Tks! – Pascal 2011-02-24 23:43:47
我認爲避免創建對象的唯一方法是堅持單個靜態類,並在每次需要創建數據庫對象時使用數據庫類型的開關。我最初在上述項目中做了這個 - 太麻煩了!然後,我將數據訪問權改爲我剛纔介紹的內容;它非常簡單,而且便於不同數據提供者的專業課程。 – 2011-02-24 23:54:32