public async Task SaveAsync(IEnumerable <IEvent> events) { foreach (var @event in events) { var eventData = JsonConvert.SerializeObject(@event, JsonSerializerSettings); var eventType = @event.GetType().Name; var dto = new EventDto { AggregateId = @event.Id, AggregateType = @event.AggregateType, ApplicationName = _settings.ApplicationName, Version = @event.Version, TimeStamp = @event.TimeStamp, EventType = eventType, EventData = eventData }; using (var conn = _sqlConnectionFactory.GetWriteConnection()) { conn.Open(); using (var trans = conn.BeginTransaction()) { try { await _dapper.ExecuteAsync(conn, _settings.SaveSql, dto, _settings.CommandType, trans).ConfigureAwait(false); await _messageQueue.PublishAsync(eventData, @event.Id, eventType).ConfigureAwait(false); trans.Commit(); } catch (Exception) { trans.Rollback(); throw; } } } } }