From 0871e07326865768f871952b77119ebcb385f965 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 6 Jan 2023 14:21:02 +0800 Subject: [PATCH] Add `AlwaysDisableTransactionsUnitOfWorkManager`. --- ...aysDisableTransactionsUnitOfWorkManager.cs | 39 +++++++++++++++++++ .../Abp/Uow/UnitOfWorkCollectionExtensions.cs | 12 ++++++ ...lwaysDisableUnitOfWorkTransaction_Tests.cs | 28 +++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AlwaysDisableTransactionsUnitOfWorkManager.cs create mode 100644 framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkCollectionExtensions.cs create mode 100644 framework/test/Volo.Abp.Uow.Tests/Volo/Abp/Uow/AlwaysDisableUnitOfWorkTransaction_Tests.cs diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AlwaysDisableTransactionsUnitOfWorkManager.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AlwaysDisableTransactionsUnitOfWorkManager.cs new file mode 100644 index 0000000000..a02f63c3e1 --- /dev/null +++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AlwaysDisableTransactionsUnitOfWorkManager.cs @@ -0,0 +1,39 @@ +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Uow; + +[DisableConventionalRegistration] +public class AlwaysDisableTransactionsUnitOfWorkManager : IUnitOfWorkManager +{ + private readonly UnitOfWorkManager _unitOfWorkManager; + + public AlwaysDisableTransactionsUnitOfWorkManager(UnitOfWorkManager unitOfWorkManager) + { + _unitOfWorkManager = unitOfWorkManager; + } + + public IUnitOfWork Current => _unitOfWorkManager.Current; + + public IUnitOfWork Begin(AbpUnitOfWorkOptions options, bool requiresNew = false) + { + options.IsTransactional = false; + return _unitOfWorkManager.Begin(options, requiresNew); + } + + public IUnitOfWork Reserve(string reservationName, bool requiresNew = false) + { + return _unitOfWorkManager.Reserve(reservationName, requiresNew); + } + + public void BeginReserved(string reservationName, AbpUnitOfWorkOptions options) + { + options.IsTransactional = false; + _unitOfWorkManager.BeginReserved(reservationName, options); + } + + public bool TryBeginReserved(string reservationName, AbpUnitOfWorkOptions options) + { + options.IsTransactional = false; + return _unitOfWorkManager.TryBeginReserved(reservationName, options); + } +} diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkCollectionExtensions.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkCollectionExtensions.cs new file mode 100644 index 0000000000..fb47ccc83c --- /dev/null +++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkCollectionExtensions.cs @@ -0,0 +1,12 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Volo.Abp.Uow; + +public static class UnitOfWorkCollectionExtensions +{ + public static IServiceCollection AddAlwaysDisableUnitOfWorkTransaction(this IServiceCollection services) + { + return services.Replace(ServiceDescriptor.Singleton()); + } +} diff --git a/framework/test/Volo.Abp.Uow.Tests/Volo/Abp/Uow/AlwaysDisableUnitOfWorkTransaction_Tests.cs b/framework/test/Volo.Abp.Uow.Tests/Volo/Abp/Uow/AlwaysDisableUnitOfWorkTransaction_Tests.cs new file mode 100644 index 0000000000..56c2ea89e3 --- /dev/null +++ b/framework/test/Volo.Abp.Uow.Tests/Volo/Abp/Uow/AlwaysDisableUnitOfWorkTransaction_Tests.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.Testing; +using Xunit; + +namespace Volo.Abp.Uow; + +public class AlwaysDisableUnitOfWorkTransaction_Tests: AbpIntegratedTest +{ + protected override void AfterAddApplication(IServiceCollection services) + { + services.AddAlwaysDisableUnitOfWorkTransaction(); + } + + [Fact] + public void AlwaysDisableUnitOfWorkTransaction_Test() + { + GetService().ShouldNotBeNull(); + + var unitOfWorkManager = ServiceProvider.GetRequiredService(); + unitOfWorkManager.GetType().ShouldBe(typeof(AlwaysDisableTransactionsUnitOfWorkManager)); + + using (var uow = unitOfWorkManager.Begin(isTransactional: true)) + { + uow.Options.IsTransactional.ShouldBeFalse(); + } + } +}