2010-10-15 47 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