我正在研究这种代码并想知道,如果从函数式编程的角度来看,有什么可以改进的吗?
如果您有不同的涉及交易的示例,那么您不必严格重新实施我的示例来回答。
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和实体框架,如果有帮助的话。
答案 0 :(得分:0)
我认为创建事务monad是处理这个问题的好方法。无论在C#中有多少FP,这都会产生很多好处:
我使用这样的东西:
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;
}
}
}