SQLConnection 实例通过 Dapper 处理

问题描述

我在我的项目中使用 ASP.NET web forms unity 进行 DI:

接下来,我在我的项目中安装了 Dapper 以通过我的 DAL 调用数据库资源。在我的 Startup 类中,我像这样插入了 IDbConnection,以便 Dapper 可以在任何地方使用该 IDbConnection:

 container.RegisterInstance<IDbConnection>(new sqlConnection(connectionString));

我这里的问题是,如果我在我的班级中使用这样的dbconnection,那么工作完成后将如何处理sql连接:

public class MyProvider: IMyProvider
{
    private readonly IDbConnection _dbConnection;
    public MyProvider(IDbConnection dbConnection)
    {
        _dbConnection = dbConnection;
    }

    public async Task<IEnumerable<MyData>> GetMyData()
    {
        const string sql = @"SELECT * from mytable";

        return await _dbConnection.QueryAsync<Content>(sql);
    }
}

在设置 DI 挂钩时,我在启动时担心这部分“(new sqlConnection(connectionString))”。调用数据库调用后如何以及何时处理 sqlConnection。上面代码中的任何地方都没有using

调用后Dapper会处理sqlConnection吗?如果没有,那么您能否分享一下如何在进行dapper调用后将上述代码转换为处理sql连接?

解决方法

它不会被释放,因为该实例实际上是一个单例,并且在应用程序的整个生命周期内都会被保留。这不是注入数据库连接的正确方法。

相反,您应该注册一个工厂方法,使用 RegisterFactory

container.RegisterFactory<IDbConnection>(f => new SqlConnection(connectionString));

然后您可以使用它来获得一个连接并将其放置在 using 块中。