避免处理 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 个通用函数,该函数将打开和关闭连接以及处理连接对象,以便我可以在获取表和列时调用它??
MySqlConnection
和SqlConnection
都继承自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"。通常,您会为每种数据库类型创建一个实现,并通过接口将其抽象出来。
也许您应该将连接的创建封装在一个单独的函数中,并且仅此而已。
我正在从 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 个通用函数,该函数将打开和关闭连接以及处理连接对象,以便我可以在获取表和列时调用它??
MySqlConnection
和SqlConnection
都继承自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"。通常,您会为每种数据库类型创建一个实现,并通过接口将其抽象出来。
也许您应该将连接的创建封装在一个单独的函数中,并且仅此而已。