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 积分,解读结果公开显示在下面。

还没有人解读过这个文件。