From 95a856f1ac3c949695046cf82c0923625f4d4fa3 Mon Sep 17 00:00:00 2001 From: hikalkan Date: Sat, 28 Mar 2015 18:45:22 +0200 Subject: [PATCH] Resolved #426: Enable and Disable filters. --- .../EntityFramework/AbpDbContext.cs | 2 +- .../EntityFramework/Uow/EfUnitOfWork.cs | 23 ++++++++----- src/Abp/Domain/Uow/IActiveUnitOfWork.cs | 8 +++++ src/Abp/Domain/Uow/UnitOfWorkBase.cs | 34 +++++++++++++++++++ .../PersonRepository_SoftDelete_Tests.cs | 14 ++++---- ...ityFrameworkConventionalRegisterer_Test.cs | 5 +++ 6 files changed, 70 insertions(+), 16 deletions(-) diff --git a/src/Abp.EntityFramework/EntityFramework/AbpDbContext.cs b/src/Abp.EntityFramework/EntityFramework/AbpDbContext.cs index 030045134c..03b29c68cd 100644 --- a/src/Abp.EntityFramework/EntityFramework/AbpDbContext.cs +++ b/src/Abp.EntityFramework/EntityFramework/AbpDbContext.cs @@ -101,7 +101,7 @@ protected AbpDbContext(DbConnection existingConnection, DbCompiledModel model, b EntityChangedEventHelper = NullEntityChangedEventHelper.Instance; } - public void Initialize() + public virtual void Initialize() { Database.Initialize(false); } diff --git a/src/Abp.EntityFramework/EntityFramework/Uow/EfUnitOfWork.cs b/src/Abp.EntityFramework/EntityFramework/Uow/EfUnitOfWork.cs index 82314fb0fd..647c6ac856 100644 --- a/src/Abp.EntityFramework/EntityFramework/Uow/EfUnitOfWork.cs +++ b/src/Abp.EntityFramework/EntityFramework/Uow/EfUnitOfWork.cs @@ -16,7 +16,6 @@ namespace Abp.EntityFramework.Uow public class EfUnitOfWork : UnitOfWorkBase, ITransientDependency { private readonly IDictionary _activeDbContexts; - private readonly List _disabledFilters; private readonly IIocResolver _iocResolver; private TransactionScope _transaction; @@ -27,7 +26,6 @@ public EfUnitOfWork(IIocResolver iocResolver) { _iocResolver = iocResolver; _activeDbContexts = new Dictionary(); - _disabledFilters = new List(); } protected override void BeginUow() @@ -85,15 +83,19 @@ protected override async Task CompleteUowAsync() public override void DisableFilter(string filterName) { - if (_disabledFilters.Contains(filterName)) + base.DisableFilter(filterName); + foreach (var activeDbContext in _activeDbContexts.Values) { - return; + activeDbContext.DisableFilter(filterName); } + } - _disabledFilters.Add(filterName); + public override void EnableFilter(string filterName) + { + base.EnableFilter(filterName); foreach (var activeDbContext in _activeDbContexts.Values) { - activeDbContext.DisableFilter(filterName); + activeDbContext.EnableFilter(filterName); } } @@ -105,9 +107,14 @@ internal TDbContext GetOrCreateDbContext() { dbContext = _iocResolver.Resolve(); - foreach (var disabledFilter in _disabledFilters) + foreach (var filterName in _disabledFilters) + { + dbContext.DisableFilter(filterName); + } + + foreach (var filterName in _enabledFilters) { - dbContext.DisableFilter(disabledFilter); + dbContext.EnableFilter(filterName); } _activeDbContexts[typeof(TDbContext)] = dbContext; diff --git a/src/Abp/Domain/Uow/IActiveUnitOfWork.cs b/src/Abp/Domain/Uow/IActiveUnitOfWork.cs index df8d6f1651..761e4d3297 100644 --- a/src/Abp/Domain/Uow/IActiveUnitOfWork.cs +++ b/src/Abp/Domain/Uow/IActiveUnitOfWork.cs @@ -55,8 +55,16 @@ public interface IActiveUnitOfWork /// /// Disables a data filter. + /// Does nothing if it's already disabled. /// /// Name of the filter. for standard filters. void DisableFilter(string filterName); + + /// + /// Enables a data filter. + /// Does nothing if it's already disabled. + /// + /// + void EnableFilter(string filterName); } } \ No newline at end of file diff --git a/src/Abp/Domain/Uow/UnitOfWorkBase.cs b/src/Abp/Domain/Uow/UnitOfWorkBase.cs index eb482589eb..cc3bfe3b88 100644 --- a/src/Abp/Domain/Uow/UnitOfWorkBase.cs +++ b/src/Abp/Domain/Uow/UnitOfWorkBase.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using Abp.Extensions; @@ -46,6 +47,18 @@ public abstract class UnitOfWorkBase : IUnitOfWork /// private Exception _exception; + protected readonly List _disabledFilters; + protected readonly List _enabledFilters; + + /// + /// Constructor. + /// + protected UnitOfWorkBase() + { + _disabledFilters = new List(); + _enabledFilters = new List(); + } + /// public void Begin(UnitOfWorkOptions options) { @@ -67,7 +80,28 @@ public void Begin(UnitOfWorkOptions options) public virtual void DisableFilter(string filterName) { + if (!_disabledFilters.Contains(filterName)) + { + _disabledFilters.Add(filterName); + } + + if (_enabledFilters.Contains(filterName)) + { + _enabledFilters.Remove(filterName); + } + } + + public virtual void EnableFilter(string filterName) + { + if (_disabledFilters.Contains(filterName)) + { + _disabledFilters.Remove(filterName); + } + if (!_enabledFilters.Contains(filterName)) + { + _enabledFilters.Add(filterName); + } } /// diff --git a/src/TestBase/Tests/Abp.TestBase.SampleApplication.Tests/People/PersonRepository_SoftDelete_Tests.cs b/src/TestBase/Tests/Abp.TestBase.SampleApplication.Tests/People/PersonRepository_SoftDelete_Tests.cs index 5e58597c36..d1a5dc2c46 100644 --- a/src/TestBase/Tests/Abp.TestBase.SampleApplication.Tests/People/PersonRepository_SoftDelete_Tests.cs +++ b/src/TestBase/Tests/Abp.TestBase.SampleApplication.Tests/People/PersonRepository_SoftDelete_Tests.cs @@ -1,5 +1,4 @@ -using System.Linq; -using Abp.Domain.Repositories; +using Abp.Domain.Repositories; using Abp.Domain.Uow; using Abp.TestBase.SampleApplication.People; using Shouldly; @@ -28,17 +27,18 @@ public void Should_Not_Retrieve_Soft_Deleteds() } [Fact] - public void Should_Retrieve_Soft_Deleteds_When_Filter_Disabled() + public void Should_Disable_And_Enable_Filters_For_SoftDelete() { var uowManager = Resolve(); using (var ouw = uowManager.Begin()) { + _personRepository.GetAllList().Count.ShouldBe(1); + uowManager.Current.DisableFilter(AbpDataFilters.SoftDelete); + _personRepository.GetAllList().Count.ShouldBe(2); - var persons = _personRepository.GetAllList().OrderBy(p => p.Name).ToList(); - persons.Count.ShouldBe(2); - persons[0].Name.ShouldBe("emre"); - persons[1].Name.ShouldBe("halil"); + uowManager.Current.EnableFilter(AbpDataFilters.SoftDelete); + _personRepository.GetAllList().Count.ShouldBe(1); ouw.Complete(); } diff --git a/src/Tests/Abp.EntityFramework.Tests/Repositories/EntityFrameworkConventionalRegisterer_Test.cs b/src/Tests/Abp.EntityFramework.Tests/Repositories/EntityFrameworkConventionalRegisterer_Test.cs index ef23b6c1d1..4e7c1b94ac 100644 --- a/src/Tests/Abp.EntityFramework.Tests/Repositories/EntityFrameworkConventionalRegisterer_Test.cs +++ b/src/Tests/Abp.EntityFramework.Tests/Repositories/EntityFrameworkConventionalRegisterer_Test.cs @@ -52,6 +52,11 @@ public MyDbContext(string nameOrConnectionString) { CalledConstructorWithConnectionString = true; } + + public override void Initialize() + { + + } } } } \ No newline at end of file