您好我有这个类来实例化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";
}
}
}
如果有人可以提供帮助或指出我的方向是正确的。
提前致谢。
答案 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
我希望你觉得这很有帮助。