From 769eb2812c8cef38a58c50bcfc74d5887792243c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 14 Apr 2018 11:27:24 +0300 Subject: [PATCH] Revised entity change events for mongodb. --- docs/Best-Practices/Entities.md | 2 +- .../Repositories/MongoDB/MongoDbRepository.cs | 24 ++-- .../DomainEvents/EntityChangeEvents_Tests.cs | 90 +-------------- .../DomainEvents/EntityChangeEvents_Tests.cs | 9 ++ .../Abp/TestApp/Testing/DomainEvents_Tests.cs | 3 +- .../Testing/EntityChangeEvents_Tests.cs | 105 ++++++++++++++++++ 6 files changed, 130 insertions(+), 103 deletions(-) create mode 100644 test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DomainEvents/EntityChangeEvents_Tests.cs create mode 100644 test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs diff --git a/docs/Best-Practices/Entities.md b/docs/Best-Practices/Entities.md index 71f7df01ac..03843c5278 100644 --- a/docs/Best-Practices/Entities.md +++ b/docs/Best-Practices/Entities.md @@ -4,7 +4,7 @@ Every aggregate root is also an entity. So, these rules are valid for aggregate roots too unless aggregate root rules override them. -- **Do** define repository interfaces in the **domain layer**. +- **Do** define entities in the **domain layer**. #### Primary Constructor diff --git a/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index 571b266060..7705a6d56e 100644 --- a/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -8,7 +8,6 @@ using MongoDB.Driver; using MongoDB.Driver.Linq; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities.Events; -using Volo.Abp.DynamicProxy; using Volo.Abp.EventBus; using Volo.Abp.MongoDB; using Volo.Abp.MultiTenancy; @@ -43,14 +42,18 @@ namespace Volo.Abp.Domain.Repositories.MongoDB public override TEntity Insert(TEntity entity, bool autoSave = false) { + /* EntityCreatedEvent (OnUowCompleted) is triggered as the first because it should be + * triggered before other events triggered inside an EntityCreating event handler. + * This is also true for other "ed" & "ing" events. + */ + + EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entity); EntityChangeEventHelper.TriggerEntityCreatingEvent(entity); TriggerDomainEvents(entity); Collection.InsertOne(entity); - EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entity); - return entity; } @@ -59,6 +62,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB bool autoSave = false, CancellationToken cancellationToken = default) { + EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entity); EntityChangeEventHelper.TriggerEntityCreatingEvent(entity); TriggerDomainEvents(entity); @@ -68,13 +72,12 @@ namespace Volo.Abp.Domain.Repositories.MongoDB cancellationToken: GetCancellationToken(cancellationToken) ); - EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entity); - return entity; } public override TEntity Update(TEntity entity, bool autoSave = false) { + EntityChangeEventHelper.TriggerEntityUpdatedEventOnUowCompleted(entity); EntityChangeEventHelper.TriggerEntityUpdatingEvent(entity); TriggerDomainEvents(entity); @@ -84,8 +87,6 @@ namespace Volo.Abp.Domain.Repositories.MongoDB entity ); - EntityChangeEventHelper.TriggerEntityUpdatedEvent(entity); - return entity; } @@ -94,6 +95,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB bool autoSave = false, CancellationToken cancellationToken = default) { + EntityChangeEventHelper.TriggerEntityUpdatedEventOnUowCompleted(entity); EntityChangeEventHelper.TriggerEntityUpdatingEvent(entity); TriggerDomainEvents(entity); @@ -104,20 +106,17 @@ namespace Volo.Abp.Domain.Repositories.MongoDB cancellationToken: GetCancellationToken(cancellationToken) ); - EntityChangeEventHelper.TriggerEntityUpdatedEvent(entity); - return entity; } public override void Delete(TEntity entity, bool autoSave = false) { + EntityChangeEventHelper.TriggerEntityDeletedEventOnUowCompleted(entity); EntityChangeEventHelper.TriggerEntityDeletingEvent(entity); Collection.DeleteOne( CreateEntityFilter(entity) ); - - EntityChangeEventHelper.TriggerEntityDeletedEvent(entity); } public override async Task DeleteAsync( @@ -125,14 +124,13 @@ namespace Volo.Abp.Domain.Repositories.MongoDB bool autoSave = false, CancellationToken cancellationToken = default) { + EntityChangeEventHelper.TriggerEntityDeletedEventOnUowCompleted(entity); EntityChangeEventHelper.TriggerEntityDeletingEvent(entity); await Collection.DeleteOneAsync( CreateEntityFilter(entity), GetCancellationToken(cancellationToken) ); - - EntityChangeEventHelper.TriggerEntityDeletedEvent(entity); } public override void Delete(Expression> predicate, bool autoSave = false) diff --git a/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/EntityChangeEvents_Tests.cs b/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/EntityChangeEvents_Tests.cs index 5c320e8312..2b94ee1ed9 100644 --- a/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/EntityChangeEvents_Tests.cs +++ b/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/EntityChangeEvents_Tests.cs @@ -1,95 +1,9 @@ -using System; -using Shouldly; -using Volo.Abp.Domain.Entities.Events; -using Volo.Abp.Domain.Repositories; -using Volo.Abp.EventBus; -using Volo.Abp.TestApp.Domain; -using Xunit; +using Volo.Abp.TestApp.Testing; namespace Volo.Abp.EntityFrameworkCore.DomainEvents { - public class EntityChangeEvents_Tests : EntityFrameworkCoreTestBase + public class EntityChangeEvents_Tests : EntityChangeEvents_Tests { - private readonly IRepository _personRepository; - private readonly IEventBus _eventBus; - public EntityChangeEvents_Tests() - { - _personRepository = GetRequiredService>(); - _eventBus = GetRequiredService(); - } - - [Fact] - public void Complex_Event_Test() - { - var personName = Guid.NewGuid().ToString("N"); - - var creatingEventTriggered = false; - var createdEventTriggered = false; - var updatingEventTriggered = false; - var updatedEventTriggered = false; - - _eventBus.Register>(data => - { - creatingEventTriggered.ShouldBeFalse(); - createdEventTriggered.ShouldBeFalse(); - updatingEventTriggered.ShouldBeFalse(); - updatedEventTriggered.ShouldBeFalse(); - - creatingEventTriggered = true; - - data.Entity.Name.ShouldBe(personName); - - /* Want to change age from 15 to 18 - * Expect to trigger EntityUpdatingEventData, EntityUpdatedEventData events */ - data.Entity.Age.ShouldBe(15); - data.Entity.Age = 18; - }); - - _eventBus.Register>(data => - { - creatingEventTriggered.ShouldBeTrue(); - createdEventTriggered.ShouldBeFalse(); - updatingEventTriggered.ShouldBeTrue(); - updatedEventTriggered.ShouldBeFalse(); - - createdEventTriggered = true; - - data.Entity.Name.ShouldBe(personName); - }); - - _eventBus.Register>(data => - { - creatingEventTriggered.ShouldBeTrue(); - createdEventTriggered.ShouldBeFalse(); - updatingEventTriggered.ShouldBeFalse(); - updatedEventTriggered.ShouldBeFalse(); - - updatingEventTriggered = true; - - data.Entity.Name.ShouldBe(personName); - data.Entity.Age.ShouldBe(18); - }); - - _eventBus.Register>(data => - { - creatingEventTriggered.ShouldBeTrue(); - createdEventTriggered.ShouldBeTrue(); - updatingEventTriggered.ShouldBeTrue(); - updatedEventTriggered.ShouldBeFalse(); - - updatedEventTriggered = true; - - data.Entity.Name.ShouldBe(personName); - data.Entity.Age.ShouldBe(18); - }); - - _personRepository.Insert(new Person(Guid.NewGuid(), personName, 15)); - - creatingEventTriggered.ShouldBeTrue(); - createdEventTriggered.ShouldBeTrue(); - updatingEventTriggered.ShouldBeTrue(); - updatedEventTriggered.ShouldBeTrue(); - } } } diff --git a/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DomainEvents/EntityChangeEvents_Tests.cs b/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DomainEvents/EntityChangeEvents_Tests.cs new file mode 100644 index 0000000000..0df187f34e --- /dev/null +++ b/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DomainEvents/EntityChangeEvents_Tests.cs @@ -0,0 +1,9 @@ +using Volo.Abp.TestApp.Testing; + +namespace Volo.Abp.MongoDB.DomainEvents +{ + public class EntityChangeEvents_Tests : EntityChangeEvents_Tests + { + + } +} diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs index d95f835201..aa0f4e83e6 100644 --- a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs @@ -10,7 +10,8 @@ using Xunit; namespace Volo.Abp.TestApp.Testing { - public abstract class DomainEvents_Tests : TestAppTestBase where TStartupModule : IAbpModule + public abstract class DomainEvents_Tests : TestAppTestBase + where TStartupModule : IAbpModule { protected readonly IRepository PersonRepository; protected readonly IEventBus EventBus; diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs new file mode 100644 index 0000000000..ca363a8730 --- /dev/null +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs @@ -0,0 +1,105 @@ +using System; +using Shouldly; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus; +using Volo.Abp.Modularity; +using Volo.Abp.TestApp.Domain; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.TestApp.Testing +{ + public abstract class EntityChangeEvents_Tests : TestAppTestBase + where TStartupModule : IAbpModule + { + protected IRepository PersonRepository { get; } + protected IEventBus EventBus { get; } + + protected EntityChangeEvents_Tests() + { + PersonRepository = GetRequiredService>(); + EventBus = GetRequiredService(); + } + + [Fact] + public void Complex_Event_Test() + { + var personName = Guid.NewGuid().ToString("N"); + + var creatingEventTriggered = false; + var createdEventTriggered = false; + var updatingEventTriggered = false; + var updatedEventTriggered = false; + + using (var uow = GetRequiredService().Begin()) + { + EventBus.Register>(data => + { + creatingEventTriggered.ShouldBeFalse(); + createdEventTriggered.ShouldBeFalse(); + updatingEventTriggered.ShouldBeFalse(); + updatedEventTriggered.ShouldBeFalse(); + + creatingEventTriggered = true; + + data.Entity.Name.ShouldBe(personName); + + /* Want to change age from 15 to 18 + * Expect to trigger EntityUpdatingEventData, EntityUpdatedEventData events */ + data.Entity.Age.ShouldBe(15); + data.Entity.Age = 18; + PersonRepository.Update(data.Entity); + }); + + EventBus.Register>(data => + { + creatingEventTriggered.ShouldBeTrue(); + createdEventTriggered.ShouldBeFalse(); + updatingEventTriggered.ShouldBeTrue(); + updatedEventTriggered.ShouldBeFalse(); + + createdEventTriggered = true; + + data.Entity.Age.ShouldBe(18); + data.Entity.Name.ShouldBe(personName); + }); + + EventBus.Register>(data => + { + creatingEventTriggered.ShouldBeTrue(); + createdEventTriggered.ShouldBeFalse(); + updatingEventTriggered.ShouldBeFalse(); + updatedEventTriggered.ShouldBeFalse(); + + updatingEventTriggered = true; + + data.Entity.Name.ShouldBe(personName); + data.Entity.Age.ShouldBe(18); + }); + + EventBus.Register>(data => + { + creatingEventTriggered.ShouldBeTrue(); + createdEventTriggered.ShouldBeTrue(); + updatingEventTriggered.ShouldBeTrue(); + updatedEventTriggered.ShouldBeFalse(); + + updatedEventTriggered = true; + + data.Entity.Name.ShouldBe(personName); + data.Entity.Age.ShouldBe(18); + }); + + PersonRepository.Insert(new Person(Guid.NewGuid(), personName, 15)); + + uow.Complete(); + } + + creatingEventTriggered.ShouldBeTrue(); + createdEventTriggered.ShouldBeTrue(); + updatingEventTriggered.ShouldBeTrue(); + updatedEventTriggered.ShouldBeTrue(); + } + } +}