using FreeSql;
using F9WebAiTest.Application.Interfaces.UOW;
namespace F9WebAiTest.Infrastructure.FreeSqls.Persistence;
///
/// 工作单元实现:基于 FreeSql 的 UnitOfWorkManager,事务内 Orm 通过 AsyncLocal 暴露给仓储。
/// 仓储通过 UnitOfWork.CurrentOrm 获取事务感知的 Orm。
///
public class UnitOfWork_F9 : IUnitOfWork_F9
{
private readonly IFreeSql _fsql;
private readonly UnitOfWorkManager _uowManager;
private static readonly AsyncLocal _currentOrm = new();
/// 当前事务内的 Orm(非事务上下文返回 null)
public static IFreeSql CurrentOrm => _currentOrm.Value;
public UnitOfWork_F9(IFreeSql fsql)
{
_fsql = fsql;
_uowManager = new UnitOfWorkManager(fsql);
}
public async Task ExecuteWithUow(Func> func)
{
using var uow = _uowManager.Begin();
_currentOrm.Value = uow.Orm;
try
{
var result = await func();
if (result) uow.Commit();
else uow.Rollback();
return result;
}
catch
{
uow.Rollback();
throw;
}
finally
{
_currentOrm.Value = null;
}
}
}