public async Task <int> CommitAsync( CancellationToken cancellationToken = default, Guid?internalCommandId = null) { await _domainEventsDispatcher.DispatchEventsAsync(); var options = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }; using var transaction = new TransactionScope(TransactionScopeOption.Required, options, TransactionScopeAsyncFlowOption.Enabled); await _aggregateStore.Save(); await _outbox.Save(); if (internalCommandId.HasValue) { using var connection = _sqlConnectionFactory.CreateNewConnection(); await connection.ExecuteScalarAsync("UPDATE payments.InternalCommands " + "SET ProcessedDate = @Date " + "WHERE Id = @Id", new { Date = DateTime.UtcNow, Id = internalCommandId.Value }); } transaction.Complete(); return(0); }
public async Task Save() { if (_messages.Any()) { using var connection = _sqlConnectionFactory.CreateNewConnection(); const string sql = "INSERT INTO [payments].[OutboxMessages] " + "([Id], [OccurredOn], [Type], [Data]) VALUES " + "(@Id, @OccurredOn, @Type, @Data)"; foreach (var message in _messages) { await connection.ExecuteScalarAsync(sql, new { message.Id, message.OccurredOn, message.Type, message.Data }); } _messages.Clear(); } }