Browse Source

Revised entity change events for mongodb.

pull/272/head
Halil İbrahim Kalkan 8 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.
- **Do** define repository interfaces in the **domain layer**.
- **Do** define entities in the **domain layer**.
#### 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 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<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 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<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
{
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 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