【问题标题】:Database factory class design数据库工厂类设计
【发布时间】:2010-10-15 18:46:27
【问题描述】:

嗨,我有这个类来实例化 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";
        }
    }
}

如果有人可以帮助或指出正确的方向,那就太好了。

提前致谢。

【问题讨论】:

  • 是的。特别是通过 LINQ 给出的所有示例。

标签: c# database class factory


【解决方案1】:

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

将接口与实现分开!

【讨论】:

  • +1 表示建议它返回一个接口,-1 表示重新发明 System.Data.Common 轮子。
  • 感谢您的回复。只是好奇为什么不使用泛型?是不是把事情复杂化了?
  • 你想通过使用泛型来完成什么?如果你使用泛型,调用者必须告诉工厂它想要什么具体类型作为回报,而实际上调用者不应该关心它得到什么实现。
【解决方案2】:

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

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

Writing Provider Independent Code in ADO.NET

希望对您有所帮助。

【讨论】:

  • 非常感谢,我会调查的。如果功能已经存在,那么我自己就没有意义了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多