In Dapper erfolgt die Verwaltung von Verbindungen hauptsächlich auf zwei Arten:
Vollständige Verwaltung von Verbindungen
Bei diesem Ansatz ist der Entwickler dafür verantwortlich, die Verbindung explizit zu öffnen und zu schließen. Ähnlich wie bei der Handhabung von Verbindungen in ADO.NET.
Dapper die Verwaltung von Verbindungen erlauben
Dapper kann Verbindungen automatisch öffnen und schließen, wenn sie nicht bereits vom Entwickler verwaltet werden. Dies ähnelt der Verwendung der DataAdapter.Fill()-Methode.
Es wird jedoch empfohlen, dass Entwickler ihre eigenen Verbindungen verwalten, insbesondere für Szenarien mit mehreren Abfragen innerhalb einer größeren Granularität (z. B. pro Anfrage).
Best Practices für den Umgang mit Verbindungen
Um Ressourcenlecks zu vermeiden und die Leistung zu verbessern, sollten Verbindungen nach der Verwendung geschlossen werden. Dies kann erreicht werden durch:
Um die Ressourcenverwaltung weiter zu verbessern, sollten Sie die Implementierung in Betracht ziehen eine Arbeitseinheit zum Verwalten von Transaktionen.
Beispielcode für eine Arbeitseinheit in C#
Das folgende Beispiel stellt eine Beispielimplementierung einer UnitOfWork bereit, die die Transaktionsverwaltung übernimmt:
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; } }
Repository-Muster mit Unit of Work
Repositorys in diesem Code basieren auf der Abhängigkeitsinjektion mit dem Konstruktor, um UnitOfWork zu empfangen, und bieten so einen zentralen Ort für die Steuerung des Zugriffs auf Datenbank.
Beispielcode für Repository mit Arbeitseinheit
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, .........); } }
Verwendung der Arbeitseinheit
Beispielverwendung der UnitOfWork mit einer Transaktion:
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; } }
Beispielverwendung von ohne a Transaktion:
using(DalSession dalSession = new DalSession()) { //Database code MyRepository myRepository = new MyRepository(dalSession.UnitOfWork); myRepository.Insert(myPoco); }
Durch die zentrale Steuerung von Verbindungen und Transaktionen mit einer Arbeitseinheit können Entwickler das Ressourcenmanagement verbessern und eine ordnungsgemäße Datenintegrität sicherstellen.
Das obige ist der detaillierte Inhalt vonWie kann ich Verbindungen und Transaktionen mit Dapper effektiv verwalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!