From 83be48eff5959e93c0505947f6f2030c78709cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 25 Sep 2017 21:35:55 +0300 Subject: [PATCH] Improved uow. --- src/Volo.Abp/Volo/Abp/Uow/ChildUnitOfWork.cs | 2 +- src/Volo.Abp/Volo/Abp/Uow/IUnitOfWork.cs | 2 +- .../Volo/Abp/Uow/IUnitOfWorkStartOptions.cs | 14 ++++++++ src/Volo.Abp/Volo/Abp/Uow/UnitOfWork.cs | 33 ++++++++++++------- .../Volo/Abp/Uow/UnitOfWorkAttribute.cs | 2 +- .../Volo/Abp/Uow/UnitOfWorkManager.cs | 5 +-- .../Volo/Abp/Uow/UnitOfWorkOptions.cs | 23 +++++++++++-- .../Volo/Abp/Uow/UnitOfWorkStartOptions.cs | 17 ++++++++-- .../Abp/Uow/UnitOfWorkTransactionBehavior.cs | 2 ++ 9 files changed, 79 insertions(+), 21 deletions(-) create mode 100644 src/Volo.Abp/Volo/Abp/Uow/IUnitOfWorkStartOptions.cs diff --git a/src/Volo.Abp/Volo/Abp/Uow/ChildUnitOfWork.cs b/src/Volo.Abp/Volo/Abp/Uow/ChildUnitOfWork.cs index 8e848aae34..d5a6e82246 100644 --- a/src/Volo.Abp/Volo/Abp/Uow/ChildUnitOfWork.cs +++ b/src/Volo.Abp/Volo/Abp/Uow/ChildUnitOfWork.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.Uow { public Guid Id => _parent.Id; - public UnitOfWorkStartOptions Options => _parent.Options; + public IUnitOfWorkStartOptions Options => _parent.Options; public IUnitOfWork Outer => _parent.Outer; diff --git a/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWork.cs b/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWork.cs index 49352a3bd2..ba47e431d2 100644 --- a/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWork.cs +++ b/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWork.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.Uow { public interface IUnitOfWork : IBasicUnitOfWork, IDatabaseApiContainer, ITransactionApiContainer { - UnitOfWorkStartOptions Options { get; } + IUnitOfWorkStartOptions Options { get; } IUnitOfWork Outer { get; } diff --git a/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWorkStartOptions.cs b/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWorkStartOptions.cs new file mode 100644 index 0000000000..9fe3bc1084 --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Uow/IUnitOfWorkStartOptions.cs @@ -0,0 +1,14 @@ +using System; +using System.Data; + +namespace Volo.Abp.Uow +{ + public interface IUnitOfWorkStartOptions + { + bool IsTransactional { get; } + + IsolationLevel? IsolationLevel { get; } + + TimeSpan? Timeout { get; } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWork.cs b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWork.cs index e0e6beaf02..173a8718df 100644 --- a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWork.cs +++ b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWork.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Uow @@ -10,7 +12,7 @@ namespace Volo.Abp.Uow { public Guid Id { get; } = Guid.NewGuid(); - public UnitOfWorkStartOptions Options { get; private set; } + public IUnitOfWorkStartOptions Options { get; private set; } public IUnitOfWork Outer { get; private set; } @@ -18,16 +20,6 @@ namespace Volo.Abp.Uow public string ReservationName { get; set; } - public void SetOuter(IUnitOfWork outer) - { - Outer = outer; - } - - public void SetOptions(UnitOfWorkStartOptions options) - { - Options = options; - } - public event EventHandler Completed; public event EventHandler Failed; public event EventHandler Disposed; @@ -36,19 +28,36 @@ namespace Volo.Abp.Uow private readonly Dictionary _databaseApis; private readonly Dictionary _transactionApis; + private readonly UnitOfWorkOptions _defaultOptions; private Exception _exception; private bool _isCompleted; private bool _isDisposed; - public UnitOfWork(IServiceProvider serviceProvider) + public UnitOfWork(IServiceProvider serviceProvider, IOptions options) { ServiceProvider = serviceProvider; + _defaultOptions = options.Value; _databaseApis = new Dictionary(); _transactionApis = new Dictionary(); } + public void SetOptions(UnitOfWorkStartOptions options) + { + if (Options != null) + { + throw new AbpException("Options must be set only once!"); + } + + Options = _defaultOptions.Normalize(options.Clone()); + } + + public void SetOuter(IUnitOfWork outer) + { + Outer = outer; + } + public void SaveChanges() { foreach (var databaseApi in _databaseApis.Values) diff --git a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkAttribute.cs b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkAttribute.cs index 3b3f68bbba..7c58fccfc0 100644 --- a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkAttribute.cs +++ b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkAttribute.cs @@ -41,7 +41,7 @@ namespace Volo.Abp.Uow { if (IsTransactional.HasValue) { - options.IsTransactional = IsTransactional; + options.IsTransactional = IsTransactional.Value; } if (Timeout.HasValue) diff --git a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkManager.cs b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkManager.cs index ccf3d6e8b1..50bb080583 100644 --- a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkManager.cs +++ b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkManager.cs @@ -1,5 +1,4 @@ using System; -using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; @@ -12,7 +11,9 @@ namespace Volo.Abp.Uow private readonly IServiceProvider _serviceProvider; private readonly IAmbientUnitOfWork _ambientUnitOfWork; - public UnitOfWorkManager(IServiceProvider serviceProvider, IAmbientUnitOfWork ambientUnitOfWork) + public UnitOfWorkManager( + IServiceProvider serviceProvider, + IAmbientUnitOfWork ambientUnitOfWork) { _serviceProvider = serviceProvider; _ambientUnitOfWork = ambientUnitOfWork; diff --git a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkOptions.cs b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkOptions.cs index e2f567720e..c073c7ad6a 100644 --- a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkOptions.cs +++ b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkOptions.cs @@ -1,15 +1,34 @@ -using System.Data; +using System; +using System.Data; namespace Volo.Abp.Uow { + //TODO: Implement default options! + /// /// Global (default) unit of work options /// public class UnitOfWorkOptions { - //TODO: Implement default options! public UnitOfWorkTransactionBehavior TransactionBehavior { get; set; } public IsolationLevel? IsolationLevel { get; set; } + + public TimeSpan? Timeout { get; set; } + + internal UnitOfWorkStartOptions Normalize(UnitOfWorkStartOptions options) + { + if (options.IsolationLevel == null) + { + options.IsolationLevel = IsolationLevel; + } + + if (options.Timeout == null) + { + options.Timeout = Timeout; + } + + return options; + } } } \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkStartOptions.cs b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkStartOptions.cs index b5799df7ff..ccde083786 100644 --- a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkStartOptions.cs +++ b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkStartOptions.cs @@ -3,12 +3,25 @@ using System.Data; namespace Volo.Abp.Uow { - public class UnitOfWorkStartOptions + public class UnitOfWorkStartOptions : IUnitOfWorkStartOptions { - public bool? IsTransactional { get; set; } + /// + /// Default: false. + /// + public bool IsTransactional { get; set; } public IsolationLevel? IsolationLevel { get; set; } public TimeSpan? Timeout { get; set; } + + public UnitOfWorkStartOptions Clone() + { + return new UnitOfWorkStartOptions + { + IsTransactional = IsTransactional, + IsolationLevel = IsolationLevel, + Timeout = Timeout + }; + } } } \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkTransactionBehavior.cs b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkTransactionBehavior.cs index 562c8fc063..cabcfd0999 100644 --- a/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkTransactionBehavior.cs +++ b/src/Volo.Abp/Volo/Abp/Uow/UnitOfWorkTransactionBehavior.cs @@ -3,7 +3,9 @@ public enum UnitOfWorkTransactionBehavior { Auto, + Enabled, + Disabled } } \ No newline at end of file