繁体   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