[英]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()来获取安装在计算机上的所有提供程序,这将返回一个数据表对象。
其背后的想法是避免提供程序特定的实现,而依赖于可满足您所有需求的通用实现。
希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.