diff --git a/src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll b/src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll index c5f958350e..14344b9ee1 100644 Binary files a/src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll and b/src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll differ diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUnitOfWorkMiddleware.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUnitOfWorkMiddleware.cs index 0a19330cd4..a915df25ae 100644 --- a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUnitOfWorkMiddleware.cs +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUnitOfWorkMiddleware.cs @@ -4,7 +4,7 @@ using Volo.Abp.Uow; namespace Volo.Abp.AspNetCore.Mvc.Uow { - class AbpUnitOfWorkMiddleware + public class AbpUnitOfWorkMiddleware { private readonly RequestDelegate _next; diff --git a/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWorkManager.cs b/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWorkManager.cs index e03e069535..338b51750f 100644 --- a/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWorkManager.cs +++ b/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWorkManager.cs @@ -8,6 +8,21 @@ namespace Volo.Abp.Uow IUnitOfWork Current { get; } [NotNull] - IBasicUnitOfWork Begin(); + IBasicUnitOfWork Begin([NotNull] UnitOfWorkStartOptions options); + } + + public static class UnitOfWorkManagerExtensions + { + [NotNull] + public static IBasicUnitOfWork Begin(this IUnitOfWorkManager unitOfWorkManager) + { + return unitOfWorkManager.Begin(new UnitOfWorkStartOptions()); + } + + [NotNull] + public static IBasicUnitOfWork BeginNew(this IUnitOfWorkManager unitOfWorkManager) + { + return unitOfWorkManager.Begin(new UnitOfWorkStartOptions {RequiresNew = true}); + } } } \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkManager.cs b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkManager.cs index 46c1ec9c1d..73c1a0ca8f 100644 --- a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkManager.cs +++ b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkManager.cs @@ -17,9 +17,11 @@ namespace Volo.Abp.Uow _ambientUnitOfWork = ambientUnitOfWork; } - public IBasicUnitOfWork Begin() + public IBasicUnitOfWork Begin(UnitOfWorkStartOptions options) { - if (_ambientUnitOfWork.UnitOfWork != null) + Check.NotNull(options, nameof(options)); + + if (!options.RequiresNew && _ambientUnitOfWork.UnitOfWork != null) { return new ChildUnitOfWork(_ambientUnitOfWork.UnitOfWork); } diff --git a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkStartOptions.cs b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkStartOptions.cs new file mode 100644 index 0000000000..daf0742861 --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkStartOptions.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.Uow +{ + public class UnitOfWorkStartOptions + { + public bool RequiresNew { get; set; } + } +} \ No newline at end of file diff --git a/test/Volo.Abp.Tests/Volo/Abp/Uow/UnitOfWork_Ambient_Scope_Tests.cs b/test/Volo.Abp.Tests/Volo/Abp/Uow/UnitOfWork_Ambient_Scope_Tests.cs index 160c390186..c0452c67e8 100644 --- a/test/Volo.Abp.Tests/Volo/Abp/Uow/UnitOfWork_Ambient_Scope_Tests.cs +++ b/test/Volo.Abp.Tests/Volo/Abp/Uow/UnitOfWork_Ambient_Scope_Tests.cs @@ -34,6 +34,9 @@ namespace Volo.Abp.Uow await uow2.CompleteAsync(); } + _unitOfWorkManager.Current.ShouldNotBeNull(); + _unitOfWorkManager.Current.ShouldBe(uow1); + await uow1.CompleteAsync(); } diff --git a/test/Volo.Abp.Tests/Volo/Abp/Uow/UnitOfWork_Nested_Tests.cs b/test/Volo.Abp.Tests/Volo/Abp/Uow/UnitOfWork_Nested_Tests.cs new file mode 100644 index 0000000000..5c4b568b4a --- /dev/null +++ b/test/Volo.Abp.Tests/Volo/Abp/Uow/UnitOfWork_Nested_Tests.cs @@ -0,0 +1,46 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.Modularity; +using Volo.Abp.TestBase; +using Xunit; + +namespace Volo.Abp.Uow +{ + public class UnitOfWork_Nested_Tests : AbpIntegratedTest + { + private readonly IUnitOfWorkManager _unitOfWorkManager; + + public UnitOfWork_Nested_Tests() + { + _unitOfWorkManager = ServiceProvider.GetRequiredService(); + } + + [Fact] + public async Task Should_Create_Nested_UnitOfWorks() + { + _unitOfWorkManager.Current.ShouldBeNull(); + + using (var uow1 = _unitOfWorkManager.Begin()) + { + _unitOfWorkManager.Current.ShouldNotBeNull(); + _unitOfWorkManager.Current.ShouldBe(uow1); + + using (var uow2 = _unitOfWorkManager.BeginNew()) + { + _unitOfWorkManager.Current.ShouldNotBeNull(); + _unitOfWorkManager.Current.Id.ShouldNotBe(uow1.Id); + + await uow2.CompleteAsync(); + } + + _unitOfWorkManager.Current.ShouldNotBeNull(); + _unitOfWorkManager.Current.ShouldBe(uow1); + + await uow1.CompleteAsync(); + } + + _unitOfWorkManager.Current.ShouldBeNull(); + } + } +}