Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任何与工厂模式有关的数据库连接,都需要对我的方法进行澄清和审查_C#_Database_Factory Pattern - Fatal编程技术网

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容器以及如何实现它。如果我能摆脱这个开关,那将是一个更干净的代码的好解决方案,谢谢:-)