数据库工厂类设计

时间:2010-10-15 18:46:27

标签: c# database class factory

您好我有这个类来实例化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 个答案:

答案 0 :(得分:4)

请勿在{{1​​}}方法中使用泛型。让所有数据访问类实现一个接口,并让该接口成为函数的返回值。

GetInstance()

将接口与实现分开!

答案 1 :(得分: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调用可以接受在机器上安装的任何Provider,Oracle,MySql,Sql等。 您还可以通过调用静态DataTable GetFactoryClasses()来获取计算机上安装的所有提供程序,这将返回一个数据表对象。

这背后的想法是避免提供者特定的实现,并依赖于满足您所有需求的通用实现。

Writing Provider Independent Code in ADO.NET

我希望你觉得这很有帮助。