Skip to content
Snippets Groups Projects
Commit 42f48bb6 authored by Václav Bílý's avatar Václav Bílý :cowboy:
Browse files

Domain - fix events to use mediatR and Fix Infrastructure...

Domain - fix events to use mediatR and Fix Infrastructure DispatchDomainEventsInterceptor to use mediatr
parent 0742651d
No related branches found
No related tags found
No related merge requests found
namespace SocialNetwork.Social.Domain.Common;
using MediatR;
public abstract class BaseEvent;
namespace SocialNetwork.Social.Domain.Common;
public abstract class BaseEvent : INotification;
......@@ -5,4 +5,8 @@
<AssemblyName>SocialNetwork.Social.Domain</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MediatR" />
</ItemGroup>
</Project>
using SocialNetwork.Social.Domain.Common;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using SocialNetwork.Social.Domain.Common;
namespace SocialNetwork.Social.Infrastructure.Data.Interceptors;
public class DispatchDomainEventsInterceptor : SaveChangesInterceptor
public class DispatchDomainEventsInterceptor(IMediator mediator) : SaveChangesInterceptor
{
public override InterceptionResult<int> SavingChanges(DbContextEventData eventData, InterceptionResult<int> result)
{
......@@ -13,34 +14,35 @@ public class DispatchDomainEventsInterceptor : SaveChangesInterceptor
return base.SavingChanges(eventData, result);
}
public override async ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData, InterceptionResult<int> result,
CancellationToken cancellationToken = default)
public override async ValueTask<InterceptionResult<int>> SavingChangesAsync(
DbContextEventData eventData, InterceptionResult<int> result,
CancellationToken cancellationToken = default
)
{
await DispatchDomainEvents(eventData.Context);
return await base.SavingChangesAsync(eventData, result, cancellationToken);
}
public Task DispatchDomainEvents(DbContext? context)
public async Task DispatchDomainEvents(DbContext? context)
{
if (context == null) return Task.CompletedTask;
if (context == null) return;
var entities = context.ChangeTracker
.Entries<BaseEntity>()
.Where(e => e.Entity.DomainEvents.Any())
.Select(e => e.Entity);
.Select(e => e.Entity)
.ToList();
var domainEvents = entities
.SelectMany(e => e.DomainEvents)
.ToList();
entities.ToList().ForEach(e => e.ClearDomainEvents());
entities.ForEach(e => e.ClearDomainEvents());
foreach (var domainEvent in domainEvents)
{
// TODO Publish domain event
await mediator.Publish(domainEvent);
}
return Task.CompletedTask;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment