gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:47 25 4
gpt4 key购买 nike

我在看这类代码时想知道,如果您从函数式编程 的角度进行处理,是否有任何可以改进的地方?

你不必严格地重新实现我的例子来回答,如果你有涉及交易的不同例子,那就太好了。

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,这都会带来很多好处:

  • 单一、全局、统一的交易处理方式
  • 不要重复自己,写一次这个类并且不要为每个 Controller 函数重新创建事务逻辑n次
  • 您可以创建此类作为接口(interface)并在集成测试中对其进行模拟,例如回滚事务,这样您的测试就不会影响数据库状态

我用的是这样的:

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;
}
}
}

关于c# - 在 C# 中以函数式方式处理数据库事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37723450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com