Dalam Dapper, mengurus sambungan dikendalikan dalam dua cara utama:
Menguruskan Sambungan Sepenuhnya
Dalam pendekatan ini, pembangun bertanggungjawab untuk membuka dan menutup sambungan secara eksplisit. Sama seperti mengendalikan sambungan dalam ADO.NET.
Membenarkan Dapper Mengurus Sambungan
Dapper boleh membuka dan menutup sambungan secara automatik jika belum diuruskan oleh pembangun. Ini seperti menggunakan kaedah DataAdapter.Fill().
Walau bagaimanapun, adalah disyorkan agar pembangun mengurus sambungan mereka sendiri, terutamanya untuk senario yang melibatkan berbilang pertanyaan dalam butiran yang lebih luas (cth., setiap permintaan).
Amalan Terbaik Pengendalian Sambungan
Untuk mengelakkan kebocoran sumber dan meningkatkan prestasi, sambungan harus ditutup selepas digunakan. Ini boleh dicapai dengan:
Untuk meningkatkan lagi pengurusan sumber, pertimbangkan untuk melaksanakan satu Unit Kerja untuk menguruskan urus niaga.
Contoh Kod untuk Unit Kerja di C#
Contoh berikut menyediakan contoh pelaksanaan UnitOfWork yang mengendalikan pengurusan transaksi:
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; } }
Corak Repositori dengan Unit Kerja
Repositori dalam kod ini bergantung pada suntikan kebergantungan dengan pembina untuk menerima UnitOfWork, menyediakan lokasi pusat untuk mengawal akses kepada pangkalan data.
Kod Contoh untuk Repositori dengan Unit Kerja
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, .........); } }
Penggunaan Unit Kerja
Contoh penggunaan UnitOfWork dengan transaksi:
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; } }
Contoh penggunaan tanpa transaksi:
using(DalSession dalSession = new DalSession()) { //Database code MyRepository myRepository = new MyRepository(dalSession.UnitOfWork); myRepository.Insert(myPoco); }
Dengan mengawal sambungan dan transaksi secara berpusat dengan Unit Kerja, pembangun boleh menambah baik pengurusan sumber dan memastikan integriti data yang betul.
Atas ialah kandungan terperinci Bagaimanakah Saya Harus Mengurus Sambungan dan Transaksi Dengan Berkesan dengan Dapper?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!