From 13d83674eeabb5964835c4f6a65c433de46fd15b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 22 Sep 2017 11:16:55 +0300 Subject: [PATCH] #23 implemented nested unit of works. --- src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll | Bin 15872 -> 15872 bytes .../Mvc/Uow/AbpUnitOfWorkMiddleware.cs | 2 +- .../Volo/Abp/Uow/IUnitOfWorkManager.cs | 17 ++++++- .../Volo/Abp/Uow/UnitOfWorkManager.cs | 6 ++- .../Volo/Abp/Uow/UnitOfWorkStartOptions.cs | 7 +++ .../Abp/Uow/UnitOfWork_Ambient_Scope_Tests.cs | 3 ++ .../Volo/Abp/Uow/UnitOfWork_Nested_Tests.cs | 46 ++++++++++++++++++ 7 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkStartOptions.cs create mode 100644 test/Volo.Abp.Tests/Volo/Abp/Uow/UnitOfWork_Nested_Tests.cs diff --git a/src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll b/src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll index c5f958350e2d0841e41273300e364db3bd42ceb9..14344b9ee16c8c7bb31dccbc2fdee66d6b647980 100644 GIT binary patch delta 2164 zcmZvee{dA#8OOiR`(AeUF1Ndvz5FC0xtL5Y7egQ;K`;;!O_XRNp-I40rb0n5LkUbk zYp6r+WWZLyHoneSnz55~fDR*L2d^ECPMxG`T3R~=gt1nOs5or~D`RV`fH-~j&CT?W zx;OjT=lgx$_u0Mo-FJ7Bk0c-Y(f0$R-~H)JBL_;TY2?@%x}=EWST9=>V5;&^x= z7~wvvaLV*>U6qFlatE9e%14!1!gXK7-Q=OjQ5~TYYE=E9isFx)Q)VevgwGqL*cbE* z?FjmXYQwLn@lZVXxAq5IFgN^wW#Adhr{Su1L)FnE&M#QJW&Y8q!Fccqs=*hkAbalO zBD;+T&i_SlkGy6a|}IHtXQDCb&XOwP8)5_5)Z{5#WoNY1D-yO?HFqg_0ANV+KF z8ya{mc;0%HRkc>r!L*oBJM4seK;~fktmju!&)P+6mpKOVP{NA=c%NRBF;=BojTF8S zT*Cudqm@612J&%}R(lY_A?h zTBfcz^P_QRCI7uG=33-pIyitSx?MH8iQ!w_FL}l`i0`5aO40OiaEeB>)h`a4zoSFy z7wwQ37Zc9#Znh3udzqiuyXb^C5!x>tUQ~yLhfciCT*a*8h4q50Lll$DV!X$!z~7lS zYTkrTIBwMOZJKu>D^Q1S%xB(P(j6HaIIM9s!_*39Ed=GyOY(N@+ z3#6dfN#RwT4eY_ocqeOIJLB4!((#mzFX;IF4E^>W>X^u{K;%18$K@INPK%CPbar^1 z7D>%9%}LD*nh<`WG0jQM3!0F=AJc5sT&J0wbpp?Fb|GHk8UKi`QJ%=+Th`#m6HqC~ zBtO6%pU3ROg?t#*)}y9xePBJud{vC8&vQ1r_s|v^q@#3>&QqJ{Q(L_XdQy#eQ5sc8 zyp^j)#h$Rgo`jFgHY)nQ#=Gz}-o*cVsx2BX>a~F}!(U(gqT+akIU7Hu_C^!=G3rJG z_43}14jRH~8pSq|o{rXqb9x8*cdp#DX4~MF&h-Q9H{U;)o+*=NmMwSbgHD^p{lyRLc);FFEd|$O=)O*G^t;c7#aec`2Jp5eQ`r%Qw{0>LMyqtE+2Q zl?P(*I!*4JN_d@FEK>8Vm?Vdfj+y5@$cgfh$t9Do^9iQ>mYq4NdLt${aI6T4Qk24x zA#(iMOVpdyJq7JtC@0nF#<*V}?+;Sc*QzPeq&pwaD~#&;;T|LFHGkwy-Xtu%>M!_?9LPb delta 2088 zcmZvde{fXQ7018lzL)pj{&;UUFIf_jP1u+;KX6HjO(K-2EYQ)d1d=A9V(kFJ2#l>* zK%Ho6c5zfPAZ_MSMzonB)Yf5=*0Jkv)Pahzsak|-r_>?>rRiXu!A`3N(zHGIX8-Bb zH}gLCobUOuckX?6Z>BHP_rsm$k(e_+xI0c|gNMFJZ%LxMf_N9OKz6n!&6OSEGuk3=G?KJ5x7`RCv@DmgF3@%H5K#Rf zu#?ARgzc{FTQ}deahvM!Tp2KFu-4Os(Mll7TJ?=R>18~=%Kj&E*r}r)IqrN|blBZP z79K@M(89f@;#2Z)ps6Jk@v+4SMapo$bA#h!gZDG148J#Sa4K;CXDlDL+6O%!F9xDq z(~0+NALnFMu%!4KUYus3){b-Em#~6-OuKSCA!)o5Gb zpnN)5S3KgL=T^nxO^$^jNAV+1o)6X+4S3J6^9TD~Yc7TZduT3B%ZgBim=4RfP-$hG zH)XxX>*(d8dq4L?~>`Qa@;PBzTeWNaSVW5q6FO3N+b@}6$PLTR3Hfz$nDsGa43h)wAwws*-QJ71S*+y5(2xkF zC#$J9_Gh0X+I{sy|hq_1)iWbUDc~I_hU-DKv^2=54=u;T3RQbvfrd- zc$!-;=P6oPrj~)eC!Y5{(v$dvUe=jOj9P|B;-F=VUZHZT#6CAHPUxzvc-X5I1LBXA z6gAjP*NAS62HM4K7$-x7@k?6A_OD%A>=#2`{{t*N=Imgebnl}>;@RL%;qj>%7CzeX zD`qFNkx$NZMk9*w8nYaynbr6U^J>kn;BRa%()Lo#n<30bbRo(77S=P@qmOwf2AJD8 ze=#1y-hOj2cHtd!DIUQ4=6d9C!OTLklEoW1VLpVzI8`vLm0_(M)%HhbOhP!&cIHXN38N7?RV48zVimiMG&B z=p_A#mWWkyn_nIKf!Hh5(b7-`Kaa~1e`V+6Vq;i&{}U0{eSvoD3$&sC*W}Gbb+Z?` zzyWLK8Y*V{CVR%dRqiTkD6OC_Tthwlrje#z{Fa`?cX$H1-xM{5bH#~CE4ruYmA!Y& zKek+MzOwQD4-S1h7q2U!hJpnA%&-%rn4c!UI20ukF+UriN|?dC;3z?^sh>?T*;}7n zP+@XWyAATQU-H{khirqBFv#Q4vt#}}9HnrxB4)vWCX+!RAS>s>IU*u{p0^N+nVAU)!)s>62UM9J= VwI=5+xMGNSbFQ%M5)IC`{|jxi$Pxem 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(); + } + } +}