避免处理 2 种不同类型对象的代码重复的通用函数

Common function to avoid code duplication for handling 2 different type of object

我正在从 Sql 服务器和 mysql 数据库获取表和列,所以我有一些代码重复。

我想保留一个通用功能,我想处理 mysql 和 sql 服务器连接(打开和关闭)以及处理连接对象。

这是我获取Mysql和ms sql表的常用函数:

public List<Tables> GetTables(string databaseName, string connectionString, string type)
{
    var list = new List<Tables>();
    if (type == 'mysql')
    {
        using (MySqlConnection con = new MySqlConnection(connectionString))
        {
            con.Open();
            list = con.GetSchema("Tables").AsEnumerable()
                              .Select
                                      (
                                          t => new Tables
                                          {
                                              Name = t["TABLE_SCHEMA"].ToString() + "." + t[2].ToString()
                                          }
                                      ).ToList();
            con.Close();
        }
    }
    else
    {
        using (SqlConnection con = new SqlConnection(connectionString))
        {
            con.Open();
            list = con.GetSchema("Tables").AsEnumerable()
                             .Select
                                     (
                                         t => new Tables
                                         {
                                             Name = t["TABLE_SCHEMA"].ToString() + "." + t[2].ToString()
                                         }
                                     ).ToList();
            con.Close();
        }
    }
    return list;
}

所以我在上面有代码重复,在获取列的情况下也是如此:

public List<Columns> GetColumns(string connectionString, string database, string table, string type)
{
    if (type == 'mysql')
    {
        using (MySqlConnection conn = new MySqlConnection(connectionString))
        {
            con.Open();
            var list = conn.GetSchema("Columns", columnRestrictions).AsEnumerable()
                           .Select
                           (
                                col => new
                                {
                                   //column details 
                                }
                           ).ToList();
            conn.Close();
        }
    }
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        if (conn.State == ConnectionState.Open)
        {
            var list = conn.GetSchema("Columns", columnRestrictions).AsEnumerable()
                           .Select
                           (
                                col => new
                                {
                                   //column details 
                                }
                           ).ToList();
            conn.Close();
            return list;
        }
        return null;
    }
}

那么谁能指导我如何避免上述代码重复并保留 1 个通用函数,该函数将打开和关闭连接以及处理连接对象,以便我可以在获取表和列时调用它??

MySqlConnectionSqlConnection都继承自DbConnection。

public List<Tables> GetTables(string databaseName, string connectionString, string type)
{
    var connection = connectionFactory.GetConnection(connectionString, type);

    return connection.GetTables(connection);
}

public List<Tables> GetColumns(string databaseName, string connectionString, string type)
{
    var connection = connectionFactory.GetConnection(connectionString, type);

    return connection.GetColumns(connection);
}

private IEnumerable<Table> GetTables(DbConnection connection)
{
    connection.Open();
    list = con.GetSchema("Tables").AsEnumerable()
              .Select(t => new Tables
              {
                   Name = t["TABLE_SCHEMA"].ToString() + "." + t[2].ToString()
              }).ToList();
    connection.Close();
 }

private IEnumerable<Table> GetColumns(DbConnection connection)
{
    connection.Open();
    list = con.GetSchema("COLUMNS").AsEnumerable()
              .Select(t => new Tables
              {
                   Name = t["COLUMN_SCHEMA"].ToString() + "." + t[2].ToString()
              }).ToList();
    connection.Close();
 }

public class ConnectionFactory
{
     public DbConnection GetConnection(string connectionString, string type)
     {
           switch(type)
           {
                case "mysql":
                     return new MySqlConnection(connectionString);
                case "mssql":
                     return new SqlConnection(connectionString);
                default:
                     throw new UnsupportedException($"{type} not supported.");
           }

     }
}

而且我假设您在同一个应用程序中需要两个连接,而不仅仅是 "in case I need to switch database provider"。通常,您会为每种数据库类型创建一个实现,并通过接口将其抽象出来。

也许您应该将连接的创建封装在一个单独的函数中,并且仅此而已。