gpt4 book ai didi

c# - 如何创建方面装饰器来处理 EF 事务

转载 作者:行者123 更新时间:2023-11-30 20:34:18 25 4
gpt4 key购买 nike

我正在(维护)一个充当数据访问层的 dll 程序集,有许多方法需要事务处理,许多其他方法不需要,它是当前“功能性”dll,没有任何事务处理方法,我需要添加它,所以我正在寻找一种简单的方法来添加事务处理程序。

我想知道是否可以使用 AOP 创建一个装饰器,我可以将其添加到需要事务的方法中。

我想要这样的东西:

[Transaction]
void MyDbMethod()
{
//DoSomething
myContext.SaveChanges();
}

对于我使用 Code First 的 EF 模型定义,当前项目使用 Unity 框架来处理其他一些 DI 任务,可以使用该框架吗?

最佳答案

如果有人遇到同样的问题,我没有找到任何“手动”解决方案,而是使用了 PostSharp库及其 OnMethodBoundaryAspect 类,但要小心,此时免费/快速许可对您可以使用它的类数量有限制,因此请仔细阅读其限制。

using System.Transactions;
using PostSharp.Aspects;
using PostSharp.Serialization;

namespace MyProject
{
[PSerializable]
public class Transaction : OnMethodBoundaryAspect
{
public Transaction()
{
//Required if the decorated method is async
ApplyToStateMachine = true;
}

public override void OnEntry(MethodExecutionArgs args)
{
//TransactionScopeAsyncFlowOption.Enabled => Required if the decorated method is async
var transactionScope = new TransactionScope(TransactionScopeOption.Required, TransactionScopeAsyncFlowOption.Enabled);
args.MethodExecutionTag = transactionScope;
}

public override void OnSuccess(MethodExecutionArgs args)
{
var transactionScope = (TransactionScope)args.MethodExecutionTag;
transactionScope.Complete();
}

public override void OnExit(MethodExecutionArgs args)
{
var transactionScope = (TransactionScope)args.MethodExecutionTag;
transactionScope.Dispose();
}
}
}

关于c# - 如何创建方面装饰器来处理 EF 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455081/

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