【问题标题】:SQLConnection instances dispose via DapperSQLConnection 实例通过 Dapper 处理
【发布时间】:2021-09-09 14:18:14
【问题描述】:

我在我的项目中使用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 连接吗?

【问题讨论】:

    标签: c# dependency-injection unity-container sqlconnection dbconnection


    【解决方案1】:

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

    你应该注册一个工厂方法,使用RegisterFactory

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

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

    【讨论】:

    • 但是它不会被处置/终身持有有关系吗?处置实际上是关闭的同义词,dapper 将打开和关闭(不处置)连接作为其操作的一部分,从池中租用并返回一些打开的 TCP 连接,因此除非在仍然尝试执行另一个查询时枚举第一个的结果,我不确定是否重用单个实例或是否创建新实例会有很大的不同..
    • @CaiusJard 可能是,但是等到有人多线​​程它......无论如何,只是感觉不对,但每个人都有权发表自己的意见
    猜你喜欢
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2019-09-17
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多