C# 任何与工厂模式有关的数据库连接,都需要对我的方法进行澄清和审查
我有一个项目,我试图实现一种方法,这样我就可以连接到任何数据库。在这个网站(和谷歌)之后,实现这一点的最佳实践是使用工厂模式(我见过一些人提到抽象工厂模式,但我从未使用过它,所以我一直使用工厂模式)。所以我用工厂模式解决了这个问题,并为我的连接创建了一个界面,如下所示:C# 任何与工厂模式有关的数据库连接,都需要对我的方法进行澄清和审查,c#,database,factory-pattern,C#,Database,Factory Pattern,我有一个项目,我试图实现一种方法,这样我就可以连接到任何数据库。在这个网站(和谷歌)之后,实现这一点的最佳实践是使用工厂模式(我见过一些人提到抽象工厂模式,但我从未使用过它,所以我一直使用工厂模式)。所以我用工厂模式解决了这个问题,并为我的连接创建了一个界面,如下所示: interface IConnection { string ConnectionString { get; set;} IDbConnection CreateConnection { get; } } cl
interface IConnection
{
string ConnectionString { get; set;}
IDbConnection CreateConnection { get; }
}
class clsFactoryDB
{
static public IConnection CreateDBConnection(int cChoice)
{
IConnection ObjSelector = null;
switch (cChoice)
{
case 1:
ObjSelector = new clsSQL();
break;
default:
ObjSelector = new clsSQL();
break;
}
return ObjSelector;
}
}
我使用的是IDbConnection
,因为主要的数据库提供者似乎实现了它
我不确定我在那里还需要什么
在此之后,我创建了工厂类,如下所示:
interface IConnection
{
string ConnectionString { get; set;}
IDbConnection CreateConnection { get; }
}
class clsFactoryDB
{
static public IConnection CreateDBConnection(int cChoice)
{
IConnection ObjSelector = null;
switch (cChoice)
{
case 1:
ObjSelector = new clsSQL();
break;
default:
ObjSelector = new clsSQL();
break;
}
return ObjSelector;
}
}
现在我只定义了SQL,但MySQL或Oracle遵循相同的过程,所以我不必麻烦,稍后再添加它
最后,我创建了我的IConnection
实现,如下所示:
class clsSQL : IConnection
{
private DbConnection connection;
string IConnection.ConnectionString
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
IDbConnection IConnection.CreateConnection
{
get
{
if (connection == null)
{
connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnection"].ConnectionString);
}
return connection;
}
}
}
现在,在我的app.config中,我为所有连接字符串添加了一个属性,我使用ConfigurationManager
引用这些字符串
<connectionStrings>
<add name ="SqlServerConnection" connectionString="SQL..." providerName="System.Data.SqlClient"/>
<add name ="MySqlServerConnection" connectionString="MySQL..." providerName="MySql.Data.MySqlClient"/>
//add more
</connectionStrings>
//添加更多
所以我的第一个问题是:我对这个概念的实施是正确的还是遗漏了什么?同样,为了做到这一点,我只关注了一些已经发布在这里的主题,我也阅读了一些关于代码项目的内容,但它们的内容总是令人困惑
现在,我的困惑来自这样一个事实,即要使其工作,必须在app.config文件(或asp的web.config)中声明连接字符串和提供程序。但是我并不总是连接到同一台服务器,所以我需要更改连接字符串(这就是为什么我在我的IConnection
界面中添加了ConnectionString
方法)。我说得对吗?因此,如果我正确地理解了这一点,我现在可以通过更改连接字符串来操作具有一个对象的任何数据库,以连接到不同的数据库
请纠正我在这里可能犯的任何错误。多谢各位 @ChetanRanpariya好的,我会试着把它发布到那里,我在工作中只能访问stackoverflow,我发现的大部分东西都来自这里。我会研究使用DI容器指定命名实例来注册每个数据库类型,然后你可以使用应用设置来选择代码路径(因此也就是要使用的数据库类型)在运行时使用switch语句不会污染代码,随着数据库类型的增加,switch语句将不断增长。应用程序设置可以被读取并用于指定要使用的命名实例,这将使您的代码更干净。如果您希望保持原样,请将cChoice设置为enum,这样可以通过在选项中添加名称而不是随机整数,从而使代码更易于管理。@Marc谢谢,我将更多地研究DI容器以及如何实现它。如果我能摆脱这个开关,那将是一个更干净的代码的好解决方案,谢谢:-)