如何定义处理数据库连接的基类
本文关键字:处理 数据库连接 基类 定义 何定义 | 更新日期: 2023-09-27 17:54:34
我有一个控制台应用程序,其基类如下:
public abstract class PaymentSystemBase : IPayable
{
private SqlConnection _connection;
protected PaymentSystemBase()
{
CreateDatabaseConnection();
}
protected void CreateDatabaseConnection()
{
if(_connection == null)
{
string connectionString = ConfigurationManager.AppSettings["connString"];
var connection = new SqlConnection(connectionString);
_connection = connection;
connection.Open();
}
}
public SqlConnection Connection
{
get { return _connection; }
}
public abstract void ProcessPayment();
}
并且有一些类派生自PaymentSystemBase:
public class PS1 : PaymentSystemBase
{
public override void ProcessPayment()
{
// Work with database using Connection from PaymentSystemBase
}
}
public class PS2 : PaymentSystemBase
{
public override void ProcessPayment()
{
// Work with database using Connection from PaymentSystemBase
}
}
主程序:
var lstPayments = new List<IPayable>
{
new PS1(),
new PS2()
};
var processPayments = new ProcessPayments(lstPayments);
processPayments.Process();
地点:
public class ProcessPayments
{
private List<IPayable> _paymentSystems;
public ProcessPayments(List<IPayable> paymentSystem)
{
_paymentSystems = paymentSystem;
}
public void Process()
{
foreach (var paymentSystem in _paymentSystems)
{
paymentSystem.ProcessPayment();
}
}
}
我的问题是如何从PaymentSystemBase类使用相同的连接并在处理后关闭它?正如我所看到的,每次创建PS1和PS2时,都会再次创建连接。
您不应该尝试共享连接对象。连接对象本身实际上是非常轻量级的,它是建立在实际物理连接之上的抽象。. NET连接池负责创建。
所以你的基类应该是这样的:public abstract class PaymentSystemBase : IPayable
{
private static string _connectionString =
ConfigurationManager.ConnectionStrings["connString"].ConnectionString
public static string ConnectionString
{
get { return _connection; }
}
public abstract void ProcessPayment();
}
然后你的派生类应该是:
public class PS1 : PaymentSystemBase
{
public override void ProcessPayment()
{
using(var conn = new SqlConnection(PaymentSystemBase.ConnectionString))
{
using(var cmd = new SqlCommand("...",conn)
{
//Prepare command
conn.Open();
cmd.ExecuteXXX();
//Process results, etc
}
}
}
}
你会注意到,我也把连接字符串从ConfigurationManager
类从AppSettings
加载到ConnectionStrings
,这是配置系统中用于存储连接字符串的专用部分。这实际上不是必需的,但更传统。