在C#中以函数方式处理数据库事务

时间:2016-06-09 10:31:32

标签: c# design-patterns functional-programming

我正在研究这种代码并想知道,如果从函数式编程的角度来看,有什么可以改进的吗?

如果您有不同的涉及交易的示例,那么您不必严格重新实施我的示例来回答。

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和实体框架,如果有帮助的话。

1 个答案:

答案 0 :(得分:0)

我认为创建事务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;
            }
        }
}