Browse Source

Trigger domain events for mongodb.

pull/272/head
Halil İbrahim Kalkan 9 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.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
using Volo.Abp.EventBus; using Volo.Abp.EventBus;
using Volo.Abp.Uow; using Volo.Abp.Uow;
@ -51,6 +52,11 @@ namespace Volo.Abp.Domain.Entities.Events
TriggerEventWithEntity(typeof(EntityCreatingEventData<>), entity, true); TriggerEventWithEntity(typeof(EntityCreatingEventData<>), entity, true);
} }
public void TriggerEntityCreatedEvent(object entity)
{
TriggerEventWithEntity(typeof(EntityCreatedEventData<>), entity, true);
}
public virtual void TriggerEntityCreatedEventOnUowCompleted(object entity) public virtual void TriggerEntityCreatedEventOnUowCompleted(object entity)
{ {
TriggerEventWithEntity(typeof(EntityCreatedEventData<>), entity, false); TriggerEventWithEntity(typeof(EntityCreatedEventData<>), entity, false);
@ -61,6 +67,11 @@ namespace Volo.Abp.Domain.Entities.Events
TriggerEventWithEntity(typeof(EntityUpdatingEventData<>), entity, true); TriggerEventWithEntity(typeof(EntityUpdatingEventData<>), entity, true);
} }
public void TriggerEntityUpdatedEvent(object entity)
{
TriggerEventWithEntity(typeof(EntityUpdatedEventData<>), entity, true);
}
public virtual void TriggerEntityUpdatedEventOnUowCompleted(object entity) public virtual void TriggerEntityUpdatedEventOnUowCompleted(object entity)
{ {
TriggerEventWithEntity(typeof(EntityUpdatedEventData<>), entity, false); TriggerEventWithEntity(typeof(EntityUpdatedEventData<>), entity, false);
@ -71,6 +82,11 @@ namespace Volo.Abp.Domain.Entities.Events
TriggerEventWithEntity(typeof(EntityDeletingEventData<>), entity, true); TriggerEventWithEntity(typeof(EntityDeletingEventData<>), entity, true);
} }
public void TriggerEntityDeletedEvent(object entity)
{
TriggerEventWithEntity(typeof(EntityDeletedEventData<>), entity, true);
}
public virtual void TriggerEntityDeletedEventOnUowCompleted(object entity) public virtual void TriggerEntityDeletedEventOnUowCompleted(object entity)
{ {
TriggerEventWithEntity(typeof(EntityDeletedEventData<>), entity, false); 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) 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); var eventType = genericEventType.MakeGenericType(entityType);
if (triggerInCurrentUnitOfWork || _unitOfWorkManager.Current == null) 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 TriggerEntityCreatingEvent(object entity);
void TriggerEntityCreatedEvent(object entity);
void TriggerEntityCreatedEventOnUowCompleted(object entity); void TriggerEntityCreatedEventOnUowCompleted(object entity);
void TriggerEntityUpdatingEvent(object entity); void TriggerEntityUpdatingEvent(object entity);
void TriggerEntityUpdatedEvent(object entity);
void TriggerEntityUpdatedEventOnUowCompleted(object entity); void TriggerEntityUpdatedEventOnUowCompleted(object entity);
void TriggerEntityDeletingEvent(object entity); void TriggerEntityDeletingEvent(object entity);
void TriggerEntityDeletedEvent(object entity);
void TriggerEntityDeletedEventOnUowCompleted(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) 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) 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) 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;
using MongoDB.Driver.Linq; using MongoDB.Driver.Linq;
using Volo.Abp.Domain.Entities; 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.MongoDB;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
@ -26,14 +29,28 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
protected IMongoDbContextProvider<TMongoDbContext> DbContextProvider { get; } protected IMongoDbContextProvider<TMongoDbContext> DbContextProvider { get; }
public IEventBus EventBus { get; set; }
public IEntityChangeEventHelper EntityChangeEventHelper { get; set; }
public MongoDbRepository(IMongoDbContextProvider<TMongoDbContext> dbContextProvider) public MongoDbRepository(IMongoDbContextProvider<TMongoDbContext> dbContextProvider)
{ {
DbContextProvider = dbContextProvider; DbContextProvider = dbContextProvider;
EventBus = NullEventBus.Instance;
EntityChangeEventHelper = NullEntityChangeEventHelper.Instance;
} }
public override TEntity Insert(TEntity entity, bool autoSave = false) public override TEntity Insert(TEntity entity, bool autoSave = false)
{ {
EntityChangeEventHelper.TriggerEntityCreatingEvent(entity);
TriggerDomainEvents(entity);
Collection.InsertOne(entity); Collection.InsertOne(entity);
EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entity);
return entity; return entity;
} }
@ -42,21 +59,33 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
EntityChangeEventHelper.TriggerEntityCreatingEvent(entity);
TriggerDomainEvents(entity);
await Collection.InsertOneAsync( await Collection.InsertOneAsync(
entity, entity,
cancellationToken: GetCancellationToken(cancellationToken) cancellationToken: GetCancellationToken(cancellationToken)
); );
EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entity);
return entity; return entity;
} }
public override TEntity Update(TEntity entity, bool autoSave = false) public override TEntity Update(TEntity entity, bool autoSave = false)
{ {
EntityChangeEventHelper.TriggerEntityUpdatingEvent(entity);
TriggerDomainEvents(entity);
Collection.ReplaceOne( Collection.ReplaceOne(
CreateEntityFilter(entity), CreateEntityFilter(entity),
entity entity
); );
EntityChangeEventHelper.TriggerEntityUpdatedEvent(entity);
return entity; return entity;
} }
@ -65,20 +94,30 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
EntityChangeEventHelper.TriggerEntityUpdatingEvent(entity);
TriggerDomainEvents(entity);
await Collection.ReplaceOneAsync( await Collection.ReplaceOneAsync(
CreateEntityFilter(entity), CreateEntityFilter(entity),
entity, entity,
cancellationToken: GetCancellationToken(cancellationToken) cancellationToken: GetCancellationToken(cancellationToken)
); );
EntityChangeEventHelper.TriggerEntityUpdatedEvent(entity);
return entity; return entity;
} }
public override void Delete(TEntity entity, bool autoSave = false) public override void Delete(TEntity entity, bool autoSave = false)
{ {
EntityChangeEventHelper.TriggerEntityDeletingEvent(entity);
Collection.DeleteOne( Collection.DeleteOne(
CreateEntityFilter(entity) CreateEntityFilter(entity)
); );
EntityChangeEventHelper.TriggerEntityDeletedEvent(entity);
} }
public override async Task DeleteAsync( public override async Task DeleteAsync(
@ -86,14 +125,20 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
EntityChangeEventHelper.TriggerEntityDeletingEvent(entity);
await Collection.DeleteOneAsync( await Collection.DeleteOneAsync(
CreateEntityFilter(entity), CreateEntityFilter(entity),
GetCancellationToken(cancellationToken) GetCancellationToken(cancellationToken)
); );
EntityChangeEventHelper.TriggerEntityDeletedEvent(entity);
} }
public override void Delete(Expression<Func<TEntity, bool>> predicate, bool autoSave = false) 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( Collection.DeleteMany(
Builders<TEntity>.Filter.Where(predicate) Builders<TEntity>.Filter.Where(predicate)
); );
@ -104,6 +149,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
//TODO: How to handle entity deletion event, soft delete and other stuff?
await Collection.DeleteManyAsync( await Collection.DeleteManyAsync(
Builders<TEntity>.Filter.Where(predicate), Builders<TEntity>.Filter.Where(predicate),
GetCancellationToken(cancellationToken) GetCancellationToken(cancellationToken)
@ -131,6 +178,28 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
$"It should be overrided and implemented by the deriving class!" $"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> 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