在 Dapper 中,管理连接主要通过两种方式处理:
完全管理连接
在这种方法中,开发人员负责显式打开和关闭连接。与在 ADO.NET 中处理连接类似。
允许 Dapper 管理连接
如果开发人员尚未管理连接,Dapper 可以自动打开和关闭连接。这就像使用 DataAdapter.Fill() 方法。
但是,建议开发人员管理自己的连接,特别是对于涉及更广泛粒度(例如每个请求)内的多个查询的场景。
连接处理最佳实践
为了避免资源泄漏并提高性能,应在之后关闭连接 使用。这可以通过以下方式实现:
要进一步增强资源管理,请考虑实施管理事务的工作单元。
工作单元的示例代码C#
以下示例提供了处理事务管理的 UnitOfWork 的示例实现:
public sealed class UnitOfWork : IUnitOfWork { internal UnitOfWork(IDbConnection connection) { _id = Guid.NewGuid(); _connection = connection; } IDbConnection _connection = null; IDbTransaction _transaction = null; Guid _id = Guid.Empty; IDbConnection IUnitOfWork.Connection { get { return _connection; } } IDbTransaction IUnitOfWork.Transaction { get { return _transaction; } } Guid IUnitOfWork.Id { get { return _id; } } public void Begin() { _transaction = _connection.BeginTransaction(); } public void Commit() { _transaction.Commit(); Dispose(); } public void Rollback() { _transaction.Rollback(); Dispose(); } public void Dispose() { if(_transaction != null) _transaction.Dispose(); _transaction = null; } }
具有工作单元的存储库模式
此代码中的存储库依赖于构造函数的依赖注入来接收 UnitOfWork,为控制对数据库。
具有工作单元的存储库的示例代码
public sealed class MyRepository { public MyRepository(IUnitOfWork unitOfWork) { this.unitOfWork = unitOfWork; } IUnitOfWork unitOfWork = null; public MyPoco Get() { return unitOfWork.Connection.Query(sql, param, unitOfWork.Transaction, .......); } public void Insert(MyPoco poco) { return unitOfWork.Connection.Execute(sql, param, unitOfWork.Transaction, .........); } }
工作单元的使用
示例用法工作单元的事务:
using(DalSession dalSession = new DalSession()) { UnitOfWork unitOfWork = dalSession.UnitOfWork; unitOfWork.Begin(); try { //Database code MyRepository myRepository = new MyRepository(unitOfWork); myRepository.Insert(myPoco); unitOfWork.Commit(); } catch { unitOfWork.Rollback(); throw; } }
没有事务的示例用法:
using(DalSession dalSession = new DalSession()) { //Database code MyRepository myRepository = new MyRepository(dalSession.UnitOfWork); myRepository.Insert(myPoco); }
通过使用工作单元集中控制连接和事务,开发人员可以改进资源管理并确保适当的数据完整性。
以上是我应该如何使用 Dapper 有效管理连接和事务?的详细内容。更多信息请关注PHP中文网其他相关文章!