Last active
November 22, 2020 13:55
-
-
Save F0b0s/fa662d66e49139f6b98d9d93672290dd to your computer and use it in GitHub Desktop.
UoW implementation based on ef core context.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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