src/02_Data/Data.Core/Internal/TransactionInterceptor.cs
(开头部分) 1KB这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。
using System.Reflection;
using System.Threading.Tasks;
using Castle.DynamicProxy;
using Mkh.Data.Abstractions;
using Mkh.Data.Abstractions.Annotations;
namespace Mkh.Data.Core.Internal;
/// <summary>
/// 特性事务拦截器
/// </summary>
internal class TransactionInterceptor : IInterceptor
{
private readonly IDbContext _context;
private readonly IRepositoryManager _manager;
public TransactionInterceptor(IDbContext context, IRepositoryManager manager)
{
_context = context;
_manager = manager;
}
public void Intercept(IInvocation invocation)
{
var transactionAttribute = invocation.MethodInvocationTarget.GetCustomAttribute<TransactionAttribute>();
if (transactionAttribute == null)
{
//调用业务方法
invocation.Proceed();
}
else
{
InterceptAsync(invocation, transactionAttribute);
}
}
private async void InterceptAsync(IInvocation invocation, TransactionAttribute attribute)
{
//创建工作单元
using var uow = _context.NewUnitOfWork(attribute.IsolationLevel);
try
{
//使仓储绑定工作单元
foreach (var repository in _manager.Repositories)
{
repository.BindingUow(uow);
}
//调用业务方法
invocation.Proceed();
dynamic result = invocation.ReturnValue;
if (result is Task<IResultModel>)
{
var rModel = await result;
if (rModel.Successful)
{
uow.SaveChanges();
}
else
后面还有 17 行代码,解锁后查看完整代码
24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明
AI 解读
登录后可用,每次 10 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
