簡體   English   中英

數據庫工廠類設計

[英]Database factory class design

嗨,我有此類來實例化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";
        }
    }
}

如果有人可以幫助或指出正確的方向,那將是很好的。

提前致謝。

不要在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";
        }
    }
}

接口與實現分開!

您應該查看System.Data.Common命名空間。 該名稱空間使用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調用可以接受安裝在計算機上的任何提供程序,Oracle,MySql,Sql等。您還可以通過調用靜態DataTable GetFactoryClasses()來獲取安裝在計算機上的所有提供程序,這將返回一個數據表對象。

其背后的想法是避免提供程序特定的實現,而依賴於可滿足您所有需求的通用實現。

在ADO.NET中編寫提供程序獨立代碼

希望對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM