Пример #1
0
        public async Task <TAggregate> GetAsync(Guid id)
        {
            var streamName = RedisExtensions.GetAggregateStream <TAggregate>(id);
            var db         = _connectionMultiplexer.GetDatabase();
            var events     = new List <AggregateEvent>();
            var checkpoint = "0-0";
            var batchSize  = _configuration.BatchSize;
            var info       = db.StreamInfo(streamName);

            do
            {
                var currentSlice = await db.StreamReadAsync(streamName, checkpoint, batchSize);

                foreach (var streamEntry in currentSlice)
                {
                    foreach (var streamEntryValue in streamEntry.Values)
                    {
                        events.Add(JsonConvert.DeserializeObject <AggregateEvent>(streamEntryValue.Value.ToString(), _serializerSettings));
                        checkpoint = streamEntry.Id;
                    }
                }
            } while (info.LastEntry.Id != checkpoint);
            var aggregate = _factory.Create <TAggregate>(events);

            return(aggregate);
        }
Пример #2
0
        public async Task SaveAsync(AggregateRoot aggregate)
        {
            var db     = _connectionMultiplexer.GetDatabase();
            var events = aggregate.UncommittedEvents;

            if (events.Any() == false)
            {
                return;
            }

            var primaryStream       = RedisExtensions.GetPrimaryStream();
            var aggregateStreamName = RedisExtensions.GetAggregateStream <TAggregate>(aggregate.AggregateId);

            foreach (var @event in events)
            {
                var key = await db.StringIncrementAsync(RedisExtensions.GetStreamIdKey());

                var messageId = $"{key}-0";
                var data      = @event.ToJson();
                if (_configuration.ProjectionsEnabled)
                {
                    var primaryStreamTask   = db.StreamAddAsync(primaryStream, aggregate.AggregateId.ToString(), data, messageId);
                    var aggregateStreamTask = db.StreamAddAsync(aggregateStreamName, aggregate.AggregateId.ToString(), data, messageId);
                    await Task.WhenAll(primaryStreamTask, aggregateStreamTask);
                }
                else
                {
                    await db.StreamAddAsync(primaryStream, aggregate.AggregateId.ToString(), data, messageId);
                }
            }
            aggregate.MarkChangesAsCommitted();
        }
Пример #3
0
 public async Task SetCheckpoint <TEntity>(string checkpoint)
 {
     var id            = checkpoint.Split("-").First();
     var db            = _connectionMultiplexer.GetDatabase();
     var checkpointKey = RedisExtensions.GetAggregateStreamCheckpoint <TEntity>();
     await db.StringSetAsync(checkpointKey, $"{id}");
 }
Пример #4
0
        public async Task <string> GetCheckpoint <TEntity>()
        {
            var db            = _connectionMultiplexer.GetDatabase();
            var checkpointKey = RedisExtensions.GetAggregateStreamCheckpoint <TEntity>();
            var checkpoint    = await db.StringGetAsync(checkpointKey);

            if (!checkpoint.HasValue)
            {
                return(await Task.FromResult($"0-0"));
            }
            return(await Task.FromResult($"{checkpoint.ToString()}-0"));
        }