From 695836bfd64f6c90b73c0b924fbffd4d7204f9bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 13 Apr 2018 15:05:18 +0300 Subject: [PATCH] Trigger domain events for mongodb. --- .../Events/EntityChangeEventHelper.cs | 18 ++++- .../Events/IEntityChangeEventHelper.cs | 8 ++- .../Events/NullEntityChangeEventHelper.cs | 15 ++++ .../Repositories/MongoDB/MongoDbRepository.cs | 69 +++++++++++++++++++ .../DomainEvents/DomainEvents_Tests.cs | 8 +++ 5 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DomainEvents/DomainEvents_Tests.cs diff --git a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs index eb34ae34aa..e3a0a9a050 100644 --- a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs +++ b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; +using Volo.Abp.DynamicProxy; using Volo.Abp.EventBus; using Volo.Abp.Uow; @@ -51,6 +52,11 @@ namespace Volo.Abp.Domain.Entities.Events TriggerEventWithEntity(typeof(EntityCreatingEventData<>), entity, true); } + public void TriggerEntityCreatedEvent(object entity) + { + TriggerEventWithEntity(typeof(EntityCreatedEventData<>), entity, true); + } + public virtual void TriggerEntityCreatedEventOnUowCompleted(object entity) { TriggerEventWithEntity(typeof(EntityCreatedEventData<>), entity, false); @@ -61,6 +67,11 @@ namespace Volo.Abp.Domain.Entities.Events TriggerEventWithEntity(typeof(EntityUpdatingEventData<>), entity, true); } + public void TriggerEntityUpdatedEvent(object entity) + { + TriggerEventWithEntity(typeof(EntityUpdatedEventData<>), entity, true); + } + public virtual void TriggerEntityUpdatedEventOnUowCompleted(object entity) { TriggerEventWithEntity(typeof(EntityUpdatedEventData<>), entity, false); @@ -71,6 +82,11 @@ namespace Volo.Abp.Domain.Entities.Events TriggerEventWithEntity(typeof(EntityDeletingEventData<>), entity, true); } + public void TriggerEntityDeletedEvent(object entity) + { + TriggerEventWithEntity(typeof(EntityDeletedEventData<>), entity, true); + } + public virtual void TriggerEntityDeletedEventOnUowCompleted(object entity) { TriggerEventWithEntity(typeof(EntityDeletedEventData<>), entity, false); @@ -116,7 +132,7 @@ namespace Volo.Abp.Domain.Entities.Events protected virtual void TriggerEventWithEntity(Type genericEventType, object entity, bool triggerInCurrentUnitOfWork) { - var entityType = entity.GetType(); + var entityType = ProxyHelper.UnProxy(entity).GetType(); var eventType = genericEventType.MakeGenericType(entityType); if (triggerInCurrentUnitOfWork || _unitOfWorkManager.Current == null) diff --git a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs index 315ee7ac89..bcd6f782b9 100644 --- a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs +++ b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs @@ -13,13 +13,19 @@ namespace Volo.Abp.Domain.Entities.Events void TriggerEntityCreatingEvent(object entity); + void TriggerEntityCreatedEvent(object entity); + void TriggerEntityCreatedEventOnUowCompleted(object entity); void TriggerEntityUpdatingEvent(object entity); - + + void TriggerEntityUpdatedEvent(object entity); + void TriggerEntityUpdatedEventOnUowCompleted(object entity); void TriggerEntityDeletingEvent(object entity); + + void TriggerEntityDeletedEvent(object entity); void TriggerEntityDeletedEventOnUowCompleted(object entity); } diff --git a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs index b5006a4806..c6f8a7afa4 100644 --- a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs +++ b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs @@ -22,6 +22,11 @@ namespace Volo.Abp.Domain.Entities.Events } + public void TriggerEntityCreatedEvent(object entity) + { + + } + public void TriggerEntityCreatedEventOnUowCompleted(object entity) { @@ -32,6 +37,11 @@ namespace Volo.Abp.Domain.Entities.Events } + public void TriggerEntityUpdatedEvent(object entity) + { + + } + public void TriggerEntityUpdatedEventOnUowCompleted(object entity) { @@ -42,6 +52,11 @@ namespace Volo.Abp.Domain.Entities.Events } + public void TriggerEntityDeletedEvent(object entity) + { + + } + public void TriggerEntityDeletedEventOnUowCompleted(object entity) { 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 b8721dac1e..571b266060 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 @@ -7,6 +7,9 @@ using System.Threading.Tasks; 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; @@ -26,14 +29,28 @@ namespace Volo.Abp.Domain.Repositories.MongoDB protected IMongoDbContextProvider DbContextProvider { get; } + public IEventBus EventBus { get; set; } + + public IEntityChangeEventHelper EntityChangeEventHelper { get; set; } + public MongoDbRepository(IMongoDbContextProvider dbContextProvider) { DbContextProvider = dbContextProvider; + + EventBus = NullEventBus.Instance; + EntityChangeEventHelper = NullEntityChangeEventHelper.Instance; } public override TEntity Insert(TEntity entity, bool autoSave = false) { + EntityChangeEventHelper.TriggerEntityCreatingEvent(entity); + + TriggerDomainEvents(entity); + Collection.InsertOne(entity); + + EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entity); + return entity; } @@ -42,21 +59,33 @@ namespace Volo.Abp.Domain.Repositories.MongoDB bool autoSave = false, CancellationToken cancellationToken = default) { + EntityChangeEventHelper.TriggerEntityCreatingEvent(entity); + + TriggerDomainEvents(entity); + await Collection.InsertOneAsync( entity, cancellationToken: GetCancellationToken(cancellationToken) ); + EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entity); + return entity; } public override TEntity Update(TEntity entity, bool autoSave = false) { + EntityChangeEventHelper.TriggerEntityUpdatingEvent(entity); + + TriggerDomainEvents(entity); + Collection.ReplaceOne( CreateEntityFilter(entity), entity ); + EntityChangeEventHelper.TriggerEntityUpdatedEvent(entity); + return entity; } @@ -65,20 +94,30 @@ namespace Volo.Abp.Domain.Repositories.MongoDB bool autoSave = false, CancellationToken cancellationToken = default) { + EntityChangeEventHelper.TriggerEntityUpdatingEvent(entity); + + TriggerDomainEvents(entity); + await Collection.ReplaceOneAsync( CreateEntityFilter(entity), entity, cancellationToken: GetCancellationToken(cancellationToken) ); + EntityChangeEventHelper.TriggerEntityUpdatedEvent(entity); + return entity; } public override void Delete(TEntity entity, bool autoSave = false) { + EntityChangeEventHelper.TriggerEntityDeletingEvent(entity); + Collection.DeleteOne( CreateEntityFilter(entity) ); + + EntityChangeEventHelper.TriggerEntityDeletedEvent(entity); } public override async Task DeleteAsync( @@ -86,14 +125,20 @@ namespace Volo.Abp.Domain.Repositories.MongoDB bool autoSave = false, CancellationToken cancellationToken = default) { + EntityChangeEventHelper.TriggerEntityDeletingEvent(entity); + await Collection.DeleteOneAsync( CreateEntityFilter(entity), GetCancellationToken(cancellationToken) ); + + EntityChangeEventHelper.TriggerEntityDeletedEvent(entity); } public override void Delete(Expression> predicate, bool autoSave = false) { + //TODO: How to handle entity deletion event, soft delete and other stuff? + Collection.DeleteMany( Builders.Filter.Where(predicate) ); @@ -104,6 +149,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB bool autoSave = false, CancellationToken cancellationToken = default) { + //TODO: How to handle entity deletion event, soft delete and other stuff? + await Collection.DeleteManyAsync( Builders.Filter.Where(predicate), GetCancellationToken(cancellationToken) @@ -131,6 +178,28 @@ namespace Volo.Abp.Domain.Repositories.MongoDB $"It should be overrided and implemented by the deriving class!" ); } + + protected virtual void TriggerDomainEvents(object entity) //TODO: TriggerDomainEventsAsync..? + { + var generatesDomainEventsEntity = entity as IGeneratesDomainEvents; + if (generatesDomainEventsEntity == null) + { + return; + } + + var entityEvents = generatesDomainEventsEntity.GetDomainEvents().ToArray(); + if (entityEvents.IsNullOrEmpty()) + { + return; + } + + foreach (var entityEvent in entityEvents) + { + EventBus.Trigger(entityEvent.GetType(), entityEvent); + } + + generatesDomainEventsEntity.ClearDomainEvents(); + } } public class MongoDbRepository diff --git a/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DomainEvents/DomainEvents_Tests.cs b/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DomainEvents/DomainEvents_Tests.cs new file mode 100644 index 0000000000..b01cb690f6 --- /dev/null +++ b/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DomainEvents/DomainEvents_Tests.cs @@ -0,0 +1,8 @@ +using Volo.Abp.TestApp.Testing; + +namespace Volo.Abp.MongoDB.DomainEvents +{ + public class DomainEvents_Tests : DomainEvents_Tests + { + } +} \ No newline at end of file