Skip to content

Commit 617cc6a

Browse files
authored
Merge pull request #17 from ardalis/ardalis/add-domain-event-interfaces
Ardalis/add domain event interfaces
2 parents c636582 + 3754732 commit 617cc6a

File tree

12 files changed

+34
-20
lines changed

12 files changed

+34
-20
lines changed

src/Ardalis.SharedKernel/Ardalis.SharedKernel.csproj

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@
1313
<RepositoryUrl>https://github.com/ardalis/Ardalis.SharedKernel</RepositoryUrl>
1414
<PackageTags>DDD;Shared Kernel;SharedKernel;Domain-Driven Design;Repository;Specification;ValueObject;Value Object;Ardalis;Clean;Clean Architecture;Clean Architecture Template</PackageTags>
1515
<PackageIcon>icon.png</PackageIcon>
16-
<Version>4.0.0</Version>
16+
<Version>4.1.0</Version>
1717
<PackageReleaseNotes>
18-
* Swapped out MediatR for Mediator Souregenerator and Mediator.Abstractions
19-
* Updated dependencies to latest versions
18+
* Added IDomainEvent and related interfaces
2019
</PackageReleaseNotes>
2120
<PublishRepositoryUrl>true</PublishRepositoryUrl>
2221
<EmbedUntrackedSources>true</EmbedUntrackedSources>
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
using Mediator;
2-
3-
namespace Ardalis.SharedKernel;
1+
namespace Ardalis.SharedKernel;
42

53
/// <summary>
64
/// A base type for domain events. Depends on Mediator INotification.
75
/// Includes DateOccurred which is set on creation.
86
/// </summary>
9-
public abstract class DomainEventBase : INotification
7+
public abstract class DomainEventBase : IDomainEvent
108
{
119
public DateTime DateOccurred { get; protected set; } = DateTime.UtcNow;
1210
}

src/Ardalis.SharedKernel/HasDomainEventsBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ namespace Ardalis.SharedKernel;
44

55
public abstract class HasDomainEventsBase : IHasDomainEvents
66
{
7-
private readonly List<DomainEventBase> _domainEvents = new();
7+
private readonly List<IDomainEvent> _domainEvents = new();
88
[NotMapped]
9-
public IReadOnlyCollection<DomainEventBase> DomainEvents => _domainEvents.AsReadOnly();
9+
public IReadOnlyCollection<IDomainEvent> DomainEvents => _domainEvents.AsReadOnly();
1010

1111
protected void RegisterDomainEvent(DomainEventBase domainEvent) => _domainEvents.Add(domainEvent);
1212
public void ClearDomainEvents() => _domainEvents.Clear();
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using Mediator;
2+
3+
namespace Ardalis.SharedKernel;
4+
5+
public interface IDomainEvent : INotification
6+
{
7+
DateTime DateOccurred { get; }
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using Mediator;
2+
3+
namespace Ardalis.SharedKernel;
4+
5+
public interface IDomainEventHandler<T> : INotificationHandler<T> where T : IDomainEvent
6+
{
7+
}

src/Ardalis.SharedKernel/IHasDomainEvents.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
public interface IHasDomainEvents
44
{
5-
IReadOnlyCollection<DomainEventBase> DomainEvents { get; }
5+
IReadOnlyCollection<IDomainEvent> DomainEvents { get; }
66
void ClearDomainEvents();
77
}

src/Ardalis.SharedKernel/MediatRDomainEventDispatcher.cs renamed to src/Ardalis.SharedKernel/MediatorDomainEventDispatcher.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ public async Task DispatchAndClearEvents(IEnumerable<IHasDomainEvents> entitiesW
2020
{
2121
if (entity is IHasDomainEvents hasDomainEvents)
2222
{
23-
DomainEventBase[] events = hasDomainEvents.DomainEvents.ToArray();
23+
IDomainEvent[] events = hasDomainEvents.DomainEvents.ToArray();
2424
hasDomainEvents.ClearDomainEvents();
2525

26-
foreach (DomainEventBase domainEvent in events)
26+
foreach (var domainEvent in events)
2727
await _mediator.Publish(domainEvent).ConfigureAwait(false);
2828
}
2929
else

src/Ardalis.SharedKernel/ValueObject.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
/// NOTE: Use `readonly record struct` for most cases in C# 10+
55
/// See: https://nietras.com/2021/06/14/csharp-10-record-struct/
66
///
7+
/// Alternately consider using Vogen
8+
///
79
/// For this class implementation, reference:
810
/// See: https://enterprisecraftsmanship.com/posts/value-object-better-implementation/
911
/// </summary>

tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEvents.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace Ardalis.SharedKernel.UnitTests.MediatorDomainEventDispatcherTests;
66

7-
public class DispatchAndClearEvents : INotificationHandler<DispatchAndClearEvents.TestDomainEvent>
7+
public class DispatchAndClearEvents : IDomainEventHandler<DispatchAndClearEvents.TestDomainEvent>
88
{
99
public class TestDomainEvent : DomainEventBase { }
1010
private class TestEntity : EntityBase
@@ -29,7 +29,7 @@ public async Task CallsPublishAndClearDomainEvents()
2929
await domainEventDispatcher.DispatchAndClearEvents(new List<EntityBase> { entity });
3030

3131
// Assert
32-
mediatorMock.Verify(m => m.Publish(It.IsAny<DomainEventBase>(), It.IsAny<CancellationToken>()), Times.Once);
32+
mediatorMock.Verify(m => m.Publish(It.IsAny<IDomainEvent>(), It.IsAny<CancellationToken>()), Times.Once);
3333
entity.DomainEvents.Should().BeEmpty();
3434
}
3535

tests/Ardalis.SharedKernel.UnitTests/MediatorDomainEventDispatcherTests/DispatchAndClearEventsWithGuidId.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace Ardalis.SharedKernel.UnitTests.MediatRDomainEventDispatcherTests;
77

8-
public class DispatchAndClearEventsWithGuidId : INotificationHandler<DispatchAndClearEventsWithGuidId.TestDomainEvent>
8+
public class DispatchAndClearEventsWithGuidId : IDomainEventHandler<DispatchAndClearEventsWithGuidId.TestDomainEvent>
99
{
1010
public class TestDomainEvent : DomainEventBase { }
1111
private class TestEntity : EntityBase<Guid>
@@ -30,7 +30,7 @@ public async Task CallsPublishAndClearDomainEvents()
3030
await domainEventDispatcher.DispatchAndClearEvents(new List<EntityBase<Guid>> { entity });
3131

3232
// Assert
33-
mediatorMock.Verify(m => m.Publish(It.IsAny<DomainEventBase>(), It.IsAny<CancellationToken>()), Times.Once);
33+
mediatorMock.Verify(m => m.Publish(It.IsAny<IDomainEvent>(), It.IsAny<CancellationToken>()), Times.Once);
3434
entity.DomainEvents.Should().BeEmpty();
3535
}
3636

0 commit comments

Comments
 (0)