Dapper では、接続の管理は主に 2 つの方法で処理されます。
接続の完全な管理
このアプローチでは、開発者は明示的に接続を開いたり閉じたりする責任があります。 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; } }
Unit of Work を使用したリポジトリ パターン
このコードのリポジトリは、コンストラクターによる依存性注入に依存して 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, .........); } }
作業単位の使用法
UnitOfWork の使用例トランザクション:
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 中国語 Web サイトの他の関連記事を参照してください。