Skip to content

Instantly share code, notes, and snippets.

@F0b0s
Last active November 22, 2020 13:55
Show Gist options
  • Save F0b0s/fa662d66e49139f6b98d9d93672290dd to your computer and use it in GitHub Desktop.
Save F0b0s/fa662d66e49139f6b98d9d93672290dd to your computer and use it in GitHub Desktop.
UoW implementation based on ef core context.
public class UnitOfWork : IUnitOfWork
{
private readonly DbContext _dbContext;
private readonly IMediator _mediator;
public UnitOfWork(DbContext dbContext, IMediator mediator)
{
_dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
}
public async Task Commit(CancellationToken cancellationToken = default)
{
foreach (var entityEntry in _dbContext.ChangeTracker.Entries<IValidatable>().Where(x => x.State == EntityState.Added || x.State == EntityState.Modified))
entityEntry.Entity.EnsureValid();
var domainEvents = _dbContext.ChangeTracker.Entries<BaseEntity>()
.SelectMany(x => x.Entity.GetEvents().Where(y => y is IDomainEvent))
.ToArray();
foreach (var @event in domainEvents)
await _mediator.Publish(@event, cancellationToken);
var integrationEvents = _dbContext.ChangeTracker.Entries<BaseEntity>()
.SelectMany(x => x.Entity.GetEvents().Where(y => !(y is IDomainEvent)))
.ToArray();
await _dbContext.SaveChangesAsync(cancellationToken);
foreach (var @event in integrationEvents)
await _mediator.Publish(@event, cancellationToken);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment