簡體   English   中英

在C#中以功能方式使用數據庫事務

[英]Work with database transactions in a functional manner in C#

我一直在看這種代碼,並且想知道,如果從函數式編程的角度出發,有什么可以改進的地方嗎?

您不必嚴格地重新實現我的示例即可回答,如果您有涉及事務的其他示例,那就太好了。

using (var unitOfWork = _uowManager.Begin())
{
    _paymentRepository
       .InsertOrUpdate(payment); // Returns payment instance

    // Being executed to get Payment.Id
    _uowManager
       .SaveChanges();

    _otherRepository
       .OtherMethod(payment.Id); // Could be changed as necessary

    unitOfWork
       .Complete()
}

如果有幫助,以上代碼基於ASP.NET Boilerplate和Entity Framework。

我認為創建事務性monad是處理此問題的好方法。 C#中的FP數量無關緊要,這會帶來很多好處:

  • 單一,全局,統一的交易方式
  • 不要重復自己,只編寫一次此類,並且不為每個控制器功能重復創建事務邏輯n次
  • 您可以將此類創建為接口,並在集成測試中對其進行模擬,例如,回滾事務,因此您的測試不會影響數據庫狀態

我用這樣的東西:

public class Tx
{     
        public DbConnectionExtra _connection { get; set; } // class which has DbTransaction and DbConnection combined 

        public T UseTx<T>(Func<T> fnToCall)
        {          
            try
            {
                _connection.BeginTransaction();

                var result = fnToCall();

               _connection._transaction.Commit();
               _connection._transaction.Dispose();

                return result;
            }
            catch
            {
               _connection._transaction.Rollback();
                _connection._transaction.Dispose();

                throw;
            }
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM