using ColaFlow.Modules.ProjectManagement.Domain.Repositories; using ColaFlow.Shared.Kernel.Common; namespace ColaFlow.Modules.ProjectManagement.Infrastructure.Persistence; /// /// Unit of Work implementation for ProjectManagement module /// public class UnitOfWork(PMDbContext context) : IUnitOfWork { private readonly PMDbContext _context = context ?? throw new ArgumentNullException(nameof(context)); public async Task SaveChangesAsync(CancellationToken cancellationToken = default) { // Dispatch domain events before saving await DispatchDomainEventsAsync(cancellationToken); // Save changes to database return await _context.SaveChangesAsync(cancellationToken); } private async Task DispatchDomainEventsAsync(CancellationToken cancellationToken) { // Get all entities with domain events var domainEntities = _context.ChangeTracker .Entries() .Where(x => x.Entity.DomainEvents.Any()) .Select(x => x.Entity) .ToList(); // Get all domain events var domainEvents = domainEntities .SelectMany(x => x.DomainEvents) .ToList(); // Clear domain events from entities domainEntities.ForEach(entity => entity.ClearDomainEvents()); // TODO: Dispatch domain events to handlers // This will be implemented when we add MediatR // For now, we just clear the events await Task.CompletedTask; } }