Browse Source

Revised entity change events for mongodb.

pull/272/head
Halil İbrahim Kalkan 9 years ago
parent
commit
769eb2812c
  1. 2
      docs/Best-Practices/Entities.md
  2. 24
      src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs
  3. 90
      test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/EntityChangeEvents_Tests.cs
  4. 9
      test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/DomainEvents/EntityChangeEvents_Tests.cs
  5. 3
      test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs
  6. 105
      test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs

2
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. 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 #### Primary Constructor

24
src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs

@ -8,7 +8,6 @@ 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.Domain.Entities.Events;
using Volo.Abp.DynamicProxy;
using Volo.Abp.EventBus; using Volo.Abp.EventBus;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
@ -43,14 +42,18 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public override TEntity Insert(TEntity entity, bool autoSave = false) 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); EntityChangeEventHelper.TriggerEntityCreatingEvent(entity);
TriggerDomainEvents(entity); TriggerDomainEvents(entity);
Collection.InsertOne(entity); Collection.InsertOne(entity);
EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entity);
return entity; return entity;
} }
@ -59,6 +62,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entity);
EntityChangeEventHelper.TriggerEntityCreatingEvent(entity); EntityChangeEventHelper.TriggerEntityCreatingEvent(entity);
TriggerDomainEvents(entity); TriggerDomainEvents(entity);
@ -68,13 +72,12 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
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.TriggerEntityUpdatedEventOnUowCompleted(entity);
EntityChangeEventHelper.TriggerEntityUpdatingEvent(entity); EntityChangeEventHelper.TriggerEntityUpdatingEvent(entity);
TriggerDomainEvents(entity); TriggerDomainEvents(entity);
@ -84,8 +87,6 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
entity entity
); );
EntityChangeEventHelper.TriggerEntityUpdatedEvent(entity);
return entity; return entity;
} }
@ -94,6 +95,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
EntityChangeEventHelper.TriggerEntityUpdatedEventOnUowCompleted(entity);
EntityChangeEventHelper.TriggerEntityUpdatingEvent(entity); EntityChangeEventHelper.TriggerEntityUpdatingEvent(entity);
TriggerDomainEvents(entity); TriggerDomainEvents(entity);
@ -104,20 +106,17 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
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.TriggerEntityDeletedEventOnUowCompleted(entity);
EntityChangeEventHelper.TriggerEntityDeletingEvent(entity); EntityChangeEventHelper.TriggerEntityDeletingEvent(entity);
Collection.DeleteOne( Collection.DeleteOne(
CreateEntityFilter(entity) CreateEntityFilter(entity)
); );
EntityChangeEventHelper.TriggerEntityDeletedEvent(entity);
} }
public override async Task DeleteAsync( public override async Task DeleteAsync(
@ -125,14 +124,13 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
EntityChangeEventHelper.TriggerEntityDeletedEventOnUowCompleted(entity);
EntityChangeEventHelper.TriggerEntityDeletingEvent(entity); 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)

90
test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/EntityChangeEvents_Tests.cs

@ -1,95 +1,9 @@
using System; using Volo.Abp.TestApp.Testing;
using Shouldly;
using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.EventBus;
using Volo.Abp.TestApp.Domain;
using Xunit;
namespace Volo.Abp.EntityFrameworkCore.DomainEvents namespace Volo.Abp.EntityFrameworkCore.DomainEvents
{ {
public class EntityChangeEvents_Tests : EntityFrameworkCoreTestBase public class EntityChangeEvents_Tests : EntityChangeEvents_Tests<AbpEntityFrameworkCoreTestModule>
{ {
private readonly IRepository<Person, Guid> _personRepository;
private readonly IEventBus _eventBus;
public EntityChangeEvents_Tests()
{
_personRepository = GetRequiredService<IRepository<Person, Guid>>();
_eventBus = GetRequiredService<IEventBus>();
}
[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<EntityCreatingEventData<Person>>(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<EntityCreatedEventData<Person>>(data =>
{
creatingEventTriggered.ShouldBeTrue();
createdEventTriggered.ShouldBeFalse();
updatingEventTriggered.ShouldBeTrue();
updatedEventTriggered.ShouldBeFalse();
createdEventTriggered = true;
data.Entity.Name.ShouldBe(personName);
});
_eventBus.Register<EntityUpdatingEventData<Person>>(data =>
{
creatingEventTriggered.ShouldBeTrue();
createdEventTriggered.ShouldBeFalse();
updatingEventTriggered.ShouldBeFalse();
updatedEventTriggered.ShouldBeFalse();
updatingEventTriggered = true;
data.Entity.Name.ShouldBe(personName);
data.Entity.Age.ShouldBe(18);
});
_eventBus.Register<EntityUpdatedEventData<Person>>(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();
}
} }
} }

9
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<AbpMongoDbTestModule>
{
}
}

3
test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs

@ -10,7 +10,8 @@ using Xunit;
namespace Volo.Abp.TestApp.Testing namespace Volo.Abp.TestApp.Testing
{ {
public abstract class DomainEvents_Tests<TStartupModule> : TestAppTestBase<TStartupModule> where TStartupModule : IAbpModule public abstract class DomainEvents_Tests<TStartupModule> : TestAppTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
protected readonly IRepository<Person, Guid> PersonRepository; protected readonly IRepository<Person, Guid> PersonRepository;
protected readonly IEventBus EventBus; protected readonly IEventBus EventBus;

105
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<TStartupModule> : TestAppTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
protected IRepository<Person, Guid> PersonRepository { get; }
protected IEventBus EventBus { get; }
protected EntityChangeEvents_Tests()
{
PersonRepository = GetRequiredService<IRepository<Person, Guid>>();
EventBus = GetRequiredService<IEventBus>();
}
[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<IUnitOfWorkManager>().Begin())
{
EventBus.Register<EntityCreatingEventData<Person>>(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<EntityCreatedEventData<Person>>(data =>
{
creatingEventTriggered.ShouldBeTrue();
createdEventTriggered.ShouldBeFalse();
updatingEventTriggered.ShouldBeTrue();
updatedEventTriggered.ShouldBeFalse();
createdEventTriggered = true;
data.Entity.Age.ShouldBe(18);
data.Entity.Name.ShouldBe(personName);
});
EventBus.Register<EntityUpdatingEventData<Person>>(data =>
{
creatingEventTriggered.ShouldBeTrue();
createdEventTriggered.ShouldBeFalse();
updatingEventTriggered.ShouldBeFalse();
updatedEventTriggered.ShouldBeFalse();
updatingEventTriggered = true;
data.Entity.Name.ShouldBe(personName);
data.Entity.Age.ShouldBe(18);
});
EventBus.Register<EntityUpdatedEventData<Person>>(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();
}
}
}
Loading…
Cancel
Save