问题描述
我在我的项目中使用 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
块中。