2010-10-15 37 views
2

嗨,我有這樣的類實例化DAL類:數據庫工廠類設計

public class Factory 
{ 
    public static T GetInstance<T>() where T : new() 
    { 
     return new T(); 
    } 
} 

我想讓我的應用程序能夠使用多個數據庫。我打算在我的web.config中設置數據庫,然後將該設置傳遞給工廠類,它將返回正確的DAL類。我認爲我的方法是可以的,只是有點卡住如何實現它,同時保持通用。

也許是這樣的:

public class Factory 
{ 
    private static readonly string dbType = ConfigurationSettings.Appsettings["SqlServer"]; 
    public static T GetInstance<T>() where T : new() 
    { 
     switch(dbType) 
     { 
      case "SqlServer": 
       return new T(); //Not sure what to put here. 
      break; 
      case: "MySql": 
       return new T(); 
      break; 
      default: "No datasource"; 
     } 
    } 
} 

如果有人可以幫助或點我這將是偉大正確的方向。

在此先感謝。

+2

你的問題不清楚。 – SLaks 2010-10-15 18:49:31

+0

是的。特別是通過LINQ提供的所有示例。 – TomTom 2010-10-15 18:57:27

回答

3

你應該看看System.Data.Common NameSpace。這個命名空間使用像DbConnection,DbReader等結構,並且它本身使用工廠方法來優化所需的DbProvider。

因此,我建議讓當前的.net數據框架爲您解決問題,而不是放下當前路徑。 這裏有個簡單的例子。

DbProviderFactory m_factory = DbProviderFactories.GetFactory("System.Data.SqlClient"); 
    DbConnection m_connection = m_factory.CreateConnection(); 
    m_connection.ConnectionString = _connstrbldr.ConnectionString; 
    m_connection.Open(); 
    using (DbCommand cmd = m_connection.CreateCommand()) 
    { 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = ""; 
     cmd.ExecuteNonQuery(); 
    } 

的GetFactory調用可以接受的機器上安裝任何供應商,甲骨文,MySQL和SQL等 您還可以通過撥打電話,以靜態數據表GetFactoryClasses獲取被安裝在計算機上的所有供應商( )這將返回一個數據表對象。

這背後的想法是避免提供程序的具體實現,並依靠一個通用的實現,可以滿足您的所有需求。

Writing Provider Independent Code in ADO.NET

我希望對您有所幫助。

+0

非常感謝Thankyou,我會研究它。如果功能已經存在,那就沒有意義了。 – gdp 2010-10-15 19:38:06

4

不要在您的GetInstance()方法上使用泛型。讓所有數據訪問類都實現一個接口,並使該接口成爲函數的返回值。

public class Factory 
{ 
    private static readonly string dbType = ConfigurationSettings.Appsettings["SqlServer"]; 
    public static IDataAccess GetInstance() 
    { 
     switch(dbType) 
     { 
      case "SqlServer": 
       return new SqlServerDataAccess(); //SqlServerDataAccess should implement IDataAccess 
      break; 
      case: "MySql": 
       return new MySqlDataAccess(); //MySqlDataAccess should implement IDataAccess 
      break; 
      default: "No datasource"; 
     } 
    } 
} 

實現的單獨接口!

+0

+1用於推薦它返回一個接口,-1用於重新創建System.Data.Common輪子。 – 2010-10-15 19:29:19

+0

感謝您的回覆。只是好奇你爲什麼不使用泛型?它僅僅是過於複雜的事情? – gdp 2010-10-15 19:30:08

+2

你想通過使用泛型來完成什麼?如果你使用泛型,調用者必須告訴工廠他們想要什麼樣的具體類型作爲回報,當調用者真的不應該在乎它實現的實現時。 – codeConcussion 2010-10-15 19:54:54