Browse Source

Trigger domain events for mongodb.

pull/272/head
Halil İbrahim Kalkan 8 years ago
parent
commit
695836bfd6
  1. 18
      src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs
  2. 8
      src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs
  3. 15
      src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs
  4. 69
      src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs
  5. 8
      test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DomainEvents/DomainEvents_Tests.cs

18
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)

8
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);
}

15
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)
{

69
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<TMongoDbContext> DbContextProvider { get; }
public IEventBus EventBus { get; set; }
public IEntityChangeEventHelper EntityChangeEventHelper { get; set; }
public MongoDbRepository(IMongoDbContextProvider<TMongoDbContext> 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<Func<TEntity, bool>> predicate, bool autoSave = false)
{
//TODO: How to handle entity deletion event, soft delete and other stuff?
Collection.DeleteMany(
Builders<TEntity>.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<TEntity>.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<TMongoDbContext, TEntity, TKey>

8
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<AbpMongoDbTestModule>
{
}
}
Loading…
Cancel
Save