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); }
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(); }
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}"); }
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")); }