如何定义处理数据库连接的基类

本文关键字:处理 数据库连接 基类 定义 何定义 | 更新日期: 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,这是配置系统中用于存储连接字符串的专用部分。这实际上不是必需的,但更传统。