Skip to content

Commit

Permalink
Add support for dispatching events with a non-int id
Browse files Browse the repository at this point in the history
  • Loading branch information
demidov-ad committed Mar 12, 2024
1 parent 8cc6556 commit 931403a
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/Ardalis.SharedKernel/IDomainEventDispatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
public interface IDomainEventDispatcher
{
Task DispatchAndClearEvents(IEnumerable<EntityBase> entitiesWithEvents);
Task DispatchAndClearEvents<TId>(IEnumerable<EntityBase<TId>> entitiesWithEvents) where TId : struct, IEquatable<TId>;
}
14 changes: 14 additions & 0 deletions src/Ardalis.SharedKernel/MediatRDomainEventDispatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,19 @@ public async Task DispatchAndClearEvents(IEnumerable<EntityBase> entitiesWithEve
}
}
}

public async Task DispatchAndClearEvents<TId>(IEnumerable<EntityBase<TId>> entitiesWithEvents)
where TId : struct, IEquatable<TId>
{
foreach (var entity in entitiesWithEvents)
{
var events = entity.DomainEvents.ToArray();
entity.ClearDomainEvents();
foreach (var domainEvent in events)
{
await _mediator.Publish(domainEvent).ConfigureAwait(false);
}
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using FluentAssertions;
using MediatR;
using Moq;
using Xunit;

namespace Ardalis.SharedKernel.UnitTests.MediatRDomainEventDispatcherTests;

public class DispatchAndClearEventsWithGuidId
{
private class TestDomainEvent : DomainEventBase { }
private class TestEntity : EntityBase<Guid>
{
public void AddTestDomainEvent()
{
var domainEvent = new TestDomainEvent();
RegisterDomainEvent(domainEvent);
}
}

[Fact]
public async void CallsPublishAndClearDomainEvents()
{
// Arrange
var mediatorMock = new Mock<IMediator>();
var domainEventDispatcher = new MediatRDomainEventDispatcher(mediatorMock.Object);
var entity = new TestEntity();
entity.AddTestDomainEvent();

// Act
await domainEventDispatcher.DispatchAndClearEvents(new List<EntityBase<Guid>> { entity });

// Assert
mediatorMock.Verify(m => m.Publish(It.IsAny<DomainEventBase>(), It.IsAny<CancellationToken>()), Times.Once);
entity.DomainEvents.Should().BeEmpty();
}
}

0 comments on commit 931403a

Please sign in to comment.