在 Dapper 中使用存储库模式时,是否需要打开和关闭数据库连接?
When using a repository pattern with Dapper, is it necessary to open and close db connections?
一篇关于用Dapper实现仓库的文章(Using Dapper.NET ORM...),有如下代码:
public class UserRepository : IUserRepository
{
private IDbConnection _db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
public List<User> GetAll()
{
return this._db.Query<User>("SELECT * FROM Users").ToList();
}
public User Find(int id)
{
return this._db.Query<User>("SELECT * FROM Users WHERE UserID = @UserID", new { id }).SingleOrDefault();
}
public User Add(User user)
{
var sqlQuery = "INSERT INTO Users (FirstName, LastName, Email) VALUES(@FirstName, @LastName, @Email); " + "SELECT CAST(SCOPE_IDENTITY() as int)";
var userId = this._db.Query<int>(sqlQuery, user).Single();
user.UserID = userId;
return user;
}
}
关于私有 IDbConnection,为什么在各个方法中从未打开或关闭它?我在其他地方也看到过这个。这个模式周围有糖吗?我的直觉是将每个 return 包装在 using 中,然后是 _db.Open();如下所示,但是,我再次看到网络上的其他几个参考文献没有这样做。
public List<User> GetAll()
{
using (_db) //or (IDbConnection _db = new SqlConnection(myConnectionString))
{
_db.Open();
return this._db.Query<User>("SELECT * FROM Users").ToList();
}
}
Dapper 确实会在检测到已关闭的连接时自动打开和关闭。所以如果你不想做那一点:它应该仍然可以正常工作。这样做的主要缺点是您无法通过关闭的连接轻松保留事务,因此如果您打算使用连接级事务,最好也从内置的连接生命周期管理开始。
一篇关于用Dapper实现仓库的文章(Using Dapper.NET ORM...),有如下代码:
public class UserRepository : IUserRepository
{
private IDbConnection _db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
public List<User> GetAll()
{
return this._db.Query<User>("SELECT * FROM Users").ToList();
}
public User Find(int id)
{
return this._db.Query<User>("SELECT * FROM Users WHERE UserID = @UserID", new { id }).SingleOrDefault();
}
public User Add(User user)
{
var sqlQuery = "INSERT INTO Users (FirstName, LastName, Email) VALUES(@FirstName, @LastName, @Email); " + "SELECT CAST(SCOPE_IDENTITY() as int)";
var userId = this._db.Query<int>(sqlQuery, user).Single();
user.UserID = userId;
return user;
}
}
关于私有 IDbConnection,为什么在各个方法中从未打开或关闭它?我在其他地方也看到过这个。这个模式周围有糖吗?我的直觉是将每个 return 包装在 using 中,然后是 _db.Open();如下所示,但是,我再次看到网络上的其他几个参考文献没有这样做。
public List<User> GetAll()
{
using (_db) //or (IDbConnection _db = new SqlConnection(myConnectionString))
{
_db.Open();
return this._db.Query<User>("SELECT * FROM Users").ToList();
}
}
Dapper 确实会在检测到已关闭的连接时自动打开和关闭。所以如果你不想做那一点:它应该仍然可以正常工作。这样做的主要缺点是您无法通过关闭的连接轻松保留事务,因此如果您打算使用连接级事务,最好也从内置的连接生命周期管理开始。