public virtual async Task <bool> SaveEntitiesAsync(CancellationToken cancellationToken = default) { using (var tx = await Database.BeginTransactionAsync()) { var domainEntities = ChangeTracker .Entries <Entity>() .Where(x => x.Entity.DomainEvents != null && x.Entity.DomainEvents.Any()); var domainEvents = domainEntities .SelectMany(x => x.Entity.DomainEvents) .OrderBy(x => x.Timestamp) .ToList(); domainEntities.ToList() .ForEach(entity => entity.Entity.ClearDomainEvents()); await base.SaveChangesAsync().ConfigureAwait(false); foreach (var domainEvent in domainEvents) { await _mediator.Publish(DomainEventNotification.Create(domainEvent)).ConfigureAwait(false); } await base.SaveChangesAsync().ConfigureAwait(false); tx.Commit(); return(true); } }
private async Task PublishEvents(Client client) { foreach (var ev in client.DomainEvents) { var dev = DomainEventNotification.Create(ev); var method = sut.GetType().GetMethod("Handle", new[] { dev.GetType(), typeof(CancellationToken) }); var task = method?.Invoke(sut, new object[] { dev, default(CancellationToken) }) as Task; await task; } client.ClearDomainEvents(); }
public async Task クライアントの最終アクセス時間更新イベントでクライアント情報を更新する() { var utcNow = DateTime.UtcNow; await sut.Handle( DomainEventNotification.Create( new ClientLastAccessedTimeUpdatedEvent(client, client.ClientId, utcNow) ) as DomainEventNotification <ClientLastAccessedTimeUpdatedEvent>); var info = await ctx.ClientInfo.FirstOrDefaultAsync(f => f.ClientId == "CLI1"); Assert.AreEqual(utcNow, info.LastAccessedTime); }