让数据库连接打开?

nfp*_*lee 2 c# sql-server sqlite unit-testing unity-container

我的Web应用程序具有以下类:

public class DatabaseProvider {
    private readonly IDbConnection _cn;

    public DatabaseProvider(IDbConnection cn) {
        _cn = cn;
    }

    public void ExecuteNonQuery(string query) {
        // Execute the query
        var cmd = _cn.CreateCommand();
        cmd.CommandText = query;
        cmd.ExecuteNonQuery();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下代码声明IDbConnection依赖项(使用Microsoft Unity):

container.RegisterType<IDbConnection>(new InjectionFactory(c => {
    var cn = new SqlConnection("...");
    cn.Open();
    return cn;
}));
Run Code Online (Sandbox Code Playgroud)

这允许我将连接换成SQLite,如下所示:

container.RegisterType<IDbConnection>(new InjectionFactory(c => {
    var cn = new SQLiteConnection("Data Source=:memory:;Version=3;");
    cn.Open();
    return cn;
}));
Run Code Online (Sandbox Code Playgroud)

我在测试时使用SQLite,连接必须保持打开,否则数据会丢失.因此,我不能在需要时打开和关闭连接.

我总是在需要时打开与数据库的连接,并想知道这是否可以扩展到大型应用程序?

我很感激有关如何改进的建议.谢谢

Pet*_*pac 5

作为ADO.NET中的一般规则,必须尽快关闭连接.

连接从连接池重用,是稀缺资源.

建议的方法是使用using(){}构造.

SQL Server连接池(ADO.NET)

我们强烈建议您在使用完毕后始终关闭连接,以便将连接返回到池中.您可以使用Connection对象的Close或Dispose方法,或打开C#中using语句所有连接,或Visual Basic中的Using语句来执行此操作.未显式关闭的连接可能不会添加或返回到池中.有关更多信息,请参阅使用语句(C#参考)或如何:为Visual Basic处理系统资源(Visual Basic).

所以,我建议您创建一个接口IDbProvider然后进行2个实现:SqlServerProviderSQLiteProvider并处理它们内部的打开和关闭连接.然后使用Unity绑定一个提供者或另一个提供者.