using Microsoft.Extensions.Logging; namespace KH.WMS.Core.Database.UnitOfWorks; /// /// UnitOfWork 扩展方法 /// public static class UnitOfWorkExtensions { /// /// 创建事务作用域,自动管理事务生命周期 /// /// 工作单元 /// 日志记录器 /// 事务隔离级别 /// 事务作用域 public static async Task BeginTransactionScopeAsync( this IUnitOfWork unitOfWork, ILogger logger, System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted) { await unitOfWork.BeginTransactionAsync(isolationLevel); return new TransactionScopeWrapper(unitOfWork, logger); } /// /// 在事务作用域中执行操作 /// /// 工作单元 /// 日志记录器 /// 要执行的操作 /// 事务隔离级别 public static async Task ExecuteInTransactionAsync( this IUnitOfWork unitOfWork, ILogger logger, Func action, System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted) { await using var scope = await unitOfWork.BeginTransactionScopeAsync(logger, isolationLevel); try { await action(); await scope.CommitAsync(); } catch { await scope.RollbackAsync(); throw; } } /// /// 在事务作用域中执行操作(带返回值) /// /// 返回值类型 /// 工作单元 /// 日志记录器 /// 要执行的操作 /// 事务隔离级别 /// 操作结果 public static async Task ExecuteInTransactionAsync( this IUnitOfWork unitOfWork, ILogger logger, Func> action, System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted) { await using var scope = await unitOfWork.BeginTransactionScopeAsync(logger, isolationLevel); try { var result = await action(); await scope.CommitAsync(); return result; } catch { await scope.RollbackAsync(); throw; } } } /// /// 事务作用域接口 /// public interface ITransactionScope : IAsyncDisposable { /// /// 提交事务 /// Task CommitAsync(); /// /// 回滚事务 /// Task RollbackAsync(); /// /// 事务是否已提交 /// bool IsCommitted { get; } } /// /// 事务作用域包装器 /// public class TransactionScopeWrapper : ITransactionScope { private readonly IUnitOfWork _unitOfWork; private readonly ILogger _logger; private bool _disposed; private bool _committed; public TransactionScopeWrapper(IUnitOfWork unitOfWork, ILogger logger) { _unitOfWork = unitOfWork; _logger = logger; } public bool IsCommitted => _committed; public async Task CommitAsync() { if (!_committed) { await _unitOfWork.CommitAsync(); _committed = true; _logger.LogDebug("事务作用域已提交"); } } public async Task RollbackAsync() { if (!_committed) { await _unitOfWork.RollbackAsync(); _committed = true; _logger.LogDebug("事务作用域已回滚"); } } public async ValueTask DisposeAsync() { if (!_disposed) { if (!_committed) { _logger.LogWarning("事务作用域释放时未提交,自动回滚"); try { await _unitOfWork.RollbackAsync(); } catch { // 忽略 dispose 时的异常 } } _disposed = true; } } }