diff --git a/samples/EasyWay.Samples/Domain/SampleAggregateRoot.cs b/samples/EasyWay.Samples/Domain/SampleAggregateRoot.cs index 624a6bb..1b89afb 100644 --- a/samples/EasyWay.Samples/Domain/SampleAggregateRoot.cs +++ b/samples/EasyWay.Samples/Domain/SampleAggregateRoot.cs @@ -4,7 +4,12 @@ public sealed class SampleAggregateRoot : AggregateRoot { internal SampleAggregateRoot() { - Add(new CreatedSampleAggragete()); + Apply(new CreatedSampleAggragete()); + } + + private void When(CreatedSampleAggragete @event) + { + } public void SampleMethod() diff --git a/source/EasyWay/Entity.cs b/source/EasyWay/Entity.cs index fb3c0ce..2071a78 100644 --- a/source/EasyWay/Entity.cs +++ b/source/EasyWay/Entity.cs @@ -1,8 +1,10 @@ using EasyWay.Internals.BusinessRules; using EasyWay.Internals.Clocks; using EasyWay.Internals.DomainEvents; +using EasyWay.Internals.Entities; using EasyWay.Internals.GuidGenerators; using System.Diagnostics.CodeAnalysis; +using System.Reflection; namespace EasyWay { @@ -26,7 +28,7 @@ protected static void Check(BusinessRule businessRule) } } - protected void Add(TDomainEvent domainEvent) + protected void Apply(TDomainEvent domainEvent) where TDomainEvent : DomainEvent { if (domainEvent is null) @@ -34,6 +36,15 @@ protected void Add(TDomainEvent domainEvent) throw new DomainEventCannotBeNullException(); } + var method = GetType().GetMethod("When", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); + + if (method is null) + { + throw new NotImplementedWhenMethodException(); + } + + method.Invoke(this, new object[] { domainEvent }); + var domainEventContext = new DomainEventContext() { EventId = GuidGenerator.New, diff --git a/source/EasyWay/Internals/DomainEvents/DomainEventCannotBeNullException.cs b/source/EasyWay/Internals/Entities/DomainEventCannotBeNullException.cs similarity index 86% rename from source/EasyWay/Internals/DomainEvents/DomainEventCannotBeNullException.cs rename to source/EasyWay/Internals/Entities/DomainEventCannotBeNullException.cs index 614c1ba..00d3ab2 100644 --- a/source/EasyWay/Internals/DomainEvents/DomainEventCannotBeNullException.cs +++ b/source/EasyWay/Internals/Entities/DomainEventCannotBeNullException.cs @@ -1,4 +1,4 @@ -namespace EasyWay.Internals.DomainEvents +namespace EasyWay.Internals.Entities { internal sealed class DomainEventCannotBeNullException : EasyWayException where TDomainEvent : DomainEvent diff --git a/source/EasyWay/Internals/Entities/NotImplementedWhenMethodException.cs b/source/EasyWay/Internals/Entities/NotImplementedWhenMethodException.cs new file mode 100644 index 0000000..21dc25c --- /dev/null +++ b/source/EasyWay/Internals/Entities/NotImplementedWhenMethodException.cs @@ -0,0 +1,9 @@ +namespace EasyWay.Internals.Entities +{ + internal sealed class NotImplementedWhenMethodException : EasyWayException + where TDomainEvent : DomainEvent + { + internal NotImplementedWhenMethodException() + : base("Not implemented 'When' method for " + typeof(TDomainEvent).Name) { } + } +} diff --git a/tests/EasyWay.Tests/Entities/AddDomainEventToEntity.cs b/tests/EasyWay.Tests/Entities/AddDomainEventToEntity.cs index 2bc8d34..b2451c7 100644 --- a/tests/EasyWay.Tests/Entities/AddDomainEventToEntity.cs +++ b/tests/EasyWay.Tests/Entities/AddDomainEventToEntity.cs @@ -1,4 +1,4 @@ -using EasyWay.Internals.DomainEvents; +using EasyWay.Internals.Entities; using EasyWay.Tests.Entities.SeedWorks; namespace EasyWay.Tests.Entities diff --git a/tests/EasyWay.Tests/Entities/SeedWorks/TestEntity.cs b/tests/EasyWay.Tests/Entities/SeedWorks/TestEntity.cs index a6e738f..5c12d81 100644 --- a/tests/EasyWay.Tests/Entities/SeedWorks/TestEntity.cs +++ b/tests/EasyWay.Tests/Entities/SeedWorks/TestEntity.cs @@ -1,4 +1,6 @@ -namespace EasyWay.Tests.Entities.SeedWorks +using static EasyWay.Tests.Entities.AddDomainEventToEntity; + +namespace EasyWay.Tests.Entities.SeedWorks { internal sealed class TestEntity : Entity { @@ -10,7 +12,9 @@ public void CheckBusinessRule(BusinessRule businessRule) public void AddDomainEvent(TDomainEvent domainEvent) where TDomainEvent : DomainEvent { - Add(domainEvent); + Apply(domainEvent); } + + private void When(TestDomainEvent @event) { } } }