Esempio n. 1
0
        public async Task <AsyncResult <DomainEventAppendResult> > AppendAsync(IDomainEvent domainEvent)
        {
            Assert.NotNull(domainEvent, nameof(domainEvent));
            Assert.NotNullOrEmpty(domainEvent.Id, nameof(domainEvent.Id));
            Assert.NotNullOrEmpty(domainEvent.AggregateRootId, nameof(domainEvent.AggregateRootId));
            Assert.NotNullOrEmpty(domainEvent.AggregateRootTypeName, nameof(domainEvent.AggregateRootTypeName));
            Assert.NotNullOrEmpty(domainEvent.CommandId, nameof(domainEvent.CommandId));

            var storedEvent = StoredDomainEventAdapter.ToStoredDomainEvent(domainEvent, _serializer);
            var sql         = string.Format(InsertSql, GetShardTableName(domainEvent.AggregateRootId));

            try
            {
                using (var connection = new SqlConnection(_options.ConnectionString))
                {
                    await connection.ExecuteAsync(sql, storedEvent);

                    return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success));
                }
            }
            catch (SqlException ex)
            {
                _logger.LogError("Append domain event has sql exception, eventInfo: " + storedEvent, ex);

                if (ex.Number == 1062 && ex.Message.Contains(_versionIndexName))
                {
                    return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success, DomainEventAppendResult.DuplicateEvent));
                }
                else if (ex.Number == 1062 && ex.Message.Contains(_commandIndexName))
                {
                    return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success, DomainEventAppendResult.DuplicateCommand));
                }
                else
                {
                    return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Failed));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError("Append domain event has sql unknown, eventInfo: " + storedEvent, ex);

                return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Failed, ex.Message));
            }
        }
Esempio n. 2
0
        public async Task <AsyncResult <DomainEventAppendResult> > AppendAllAsync(DomainEventStream eventStream)
        {
            Assert.NotNull(eventStream, nameof(eventStream));
            Assert.NotNullOrEmpty(eventStream.AggregateRootId, nameof(eventStream.AggregateRootId));
            Assert.NotNullOrEmpty(eventStream.AggregateRootTypeName, nameof(eventStream.AggregateRootTypeName));
            Assert.LengthGreaterThan(nameof(eventStream.Events), eventStream.Events.Count(), 0);

            var sql          = string.Format(InsertSql, GetShardTableName(eventStream.AggregateRootId));
            var storedEvents = eventStream.Events.Select(it => StoredDomainEventAdapter.ToStoredDomainEvent(it, _serializer));

            try
            {
                using (var connection = new SqlConnection(_options.ConnectionString))
                {
                    await connection.OpenAsync();

                    var transaction = await connection.BeginTransactionAsync();

                    try
                    {
                        using (var copy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
                        {
                            copy.BatchSize            = eventStream.Events.Count();
                            copy.BulkCopyTimeout      = _appendEventStreamTimeoutInSeconds;
                            copy.DestinationTableName = GetShardTableName(eventStream.AggregateRootId);
                            await copy.WriteToServerAsync(BuildStoreEventTableStructure());

                            await transaction.CommitAsync();
                        }

                        return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success));
                    }
                    catch (Exception)
                    {
                        try
                        {
                            await transaction.RollbackAsync();
                        }
                        catch (Exception ex)
                        {
                            _logger.LogError($"the method{nameof(AppendAllAsync)}'s transaction rollback failed.", ex);
                        }

                        throw;
                    }
                }
            }
            catch (SqlException ex)
            {
                _logger.LogError("Apend all domain events associated with a aggregation has sql exception.", ex);

                if (ex.Number == 2601 && ex.Message.Contains(_versionIndexName))
                {
                    return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success, DomainEventAppendResult.DuplicateEvent));
                }
                else if (ex.Number == 2601 && ex.Message.Contains(_commandIndexName))
                {
                    return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success, DomainEventAppendResult.DuplicateCommand));
                }
                else
                {
                    return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Failed));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError("Apend all domain events associated with a aggregation has unknown exception.", ex);

                return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Failed));
            }
        }