首頁 >資料庫 >mysql教程 >我應該如何使用 Dapper 有效管理連線和事務?

我應該如何使用 Dapper 有效管理連線和事務?

Barbara Streisand
Barbara Streisand原創
2024-12-19 07:44:10586瀏覽

How Should I Manage Connections and Transactions Effectively with Dapper?

使用Dapper 管理連線

在Dapper 中,管理連線主要透過兩種方式處理:

完全管理連線

在這種方法中,開發人員負責明確開啟和關閉連線。與在 ADO.NET 中處理連線類似。

允許 Dapper 管理連線

如果開發人員尚未管理連接,Dapper 可以自動開啟和關閉連線。這就像使用 DataAdapter.Fill() 方法。

但是,建議開發人員管理自己的連接,特別是對於涉及更廣泛粒度(例如每個請求)內的多個查詢的場景。

連接處理最佳實踐

為了避免資源洩漏並提高效能,應在之後關閉連線 使用。這可以透過以下方式實現:

  • 呼叫 Close()、Dispose() 或將連線包含在 using 區塊中。

要進一步增強資源管理,請考慮實施管理事務的工作單元。

工作單元的範例程式碼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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn