public async Task SaveEventsAsync <TAggregateRoot>(TAggregateRoot aggregateRoot) where TAggregateRoot : AggregateRoot
        {
            var events  = aggregateRoot.UncommittedEvent;
            var version = aggregateRoot.Version;

            const string INSERT_SQL = "INSERT INTO events_storage (Id,AggregateId,Event,EventType,Version) VALUES (@id,@aggregateId,@event,@eventType,@version)";

            using (var connection = connectionFactory.Create(ConnectionType.EventSourcing))
            {
                connection.Open();
                using (var transaction = connection.BeginTransaction())
                {
                    try
                    {
                        foreach (var @event in events)
                        {
                            version++;
                            @event.Version = version;
                            //每1024个事件创建一个快照
                            if (version % 1024 == 0)
                            {
                                var memento = aggregateRoot.GetMemento();
                                memento.Version = version;
                                await mementoStorage.SaveMementoAsync(memento);
                            }
                            var json = JsonConvert.SerializeObject(@event);
                            var type = @event.GetType();

                            await connection.ExecuteAsync(INSERT_SQL, new
                            {
                                Id          = Guid.NewGuid().ToString(),
                                aggregateId = aggregateRoot.Id.ToString(),
                                Event       = json,
                                EventType   = type.FullName,
                                Version     = version
                            }, transaction);
                        }

                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        logger.LogError(ex, ex.Message);
                        transaction.Rollback();
                    }
                }
                connection.Close();
            }
        }
Example #2
0
        public async Task SaveEventsAsync <TAggregateRoot>(TAggregateRoot aggregateRoot) where TAggregateRoot : AggregateRoot
        {
            var queue   = events.GetOrAdd(aggregateRoot.Id, id => new ConcurrentQueue <Event>());
            var version = aggregateRoot.Version;

            foreach (var @event in aggregateRoot.UncommittedEvent)
            {
                version++;
                @event.Version = version;
                if (version % 1024 == 0)
                {
                    var memento = aggregateRoot.GetMemento();
                    memento.Version = version;
                    await mementoStorage.SaveMementoAsync(memento);
                }

                queue.Enqueue(@event);
            }
        }