private async Task SetContent(CloudBlockBlob blob, T state) { string content = _jsonProcessor.ToJson(state); using (var source = new MemoryStream(_encoding.GetBytes(content))) { await blob.UploadFromStreamAsync(source).ConfigureAwait(continueOnCapturedContext: false); } }
private async Task SaveAndPublish(string stateType, Guid transaction, Guid streamId, long startVersion, IReadOnlyList <object> events, TracingProperties tracingProperties) { if (events.Count == 0) { return; } await SaveQueueTicket().ConfigureAwait(continueOnCapturedContext: false); await SaveEvents().ConfigureAwait(continueOnCapturedContext: false); await PublishPendingEvents().ConfigureAwait(continueOnCapturedContext: false); Task SaveQueueTicket() { var queueTicket = new QueueTicket(stateType, streamId, startVersion, events.Count, transaction); return(_table.ExecuteAsync(TableOperation.Insert(queueTicket))); } Task SaveEvents() { var batch = new TableBatchOperation(); for (int i = 0; i < events.Count; i++) { object source = events[i]; var streamEvent = new StreamEvent( stateType, streamId, version: startVersion + i, raisedTimeUtc: DateTime.UtcNow, eventType: _typeResolver.ResolveTypeName(source.GetType()), payload: _jsonProcessor.ToJson(source), messageId: $"{Guid.NewGuid()}", tracingProperties.OperationId, tracingProperties.Contributor, tracingProperties.ParentId, transaction); batch.Insert(streamEvent); } return(_table.ExecuteBatchAsync(batch)); } Task PublishPendingEvents() => _publisher.PublishEvents(stateType, streamId); }
private async Task SaveAndPublish(string stateType, Guid transaction, Guid streamId, long startVersion, ImmutableArray <object> events, TracingProperties tracingProperties = default) { await SaveEvents().ConfigureAwait(continueOnCapturedContext: false); await PublishPendingEvents().ConfigureAwait(continueOnCapturedContext: false); async Task SaveEvents() { using (EventStoreContext context = _contextFactory.Invoke()) { for (int i = 0; i < events.Length; i++) { object source = events[i]; var streamEvent = new StreamEvent( stateType, streamId, version: startVersion + i, raisedTimeUtc: DateTime.UtcNow, eventType: _typeResolver.ResolveTypeName(source.GetType()), payload: _jsonProcessor.ToJson(source), messageId: $"{Guid.NewGuid()}", tracingProperties.OperationId, tracingProperties.Contributor, tracingProperties.ParentId, transaction); context.Add(streamEvent); context.Add(new PendingEvent(streamEvent)); } await context.SaveChangesAsync().ConfigureAwait(continueOnCapturedContext: false); } } Task PublishPendingEvents() => _publisher.PublishEvents(stateType, streamId); }
public EventData ConvertToEvent(Message message) { if (message is null) { throw new ArgumentNullException(nameof(message)); } object data = message.Data; TracingProperties tracingProperties = message.TracingProperties; byte[] array = Encoding.UTF8.GetBytes(_jsonProcessor.ToJson(data)); return(new EventData(array) { Properties = { ["Id"] = message.Id, ["Type"] = _typeResolver.ResolveTypeName(data.GetType()), ["OperationId"] = tracingProperties.OperationId, ["Contributor"] = tracingProperties.Contributor, ["ParentId"] = tracingProperties.ParentId, }, }); }
private async Task SaveAndPublish(string stateType, Guid transaction, Guid streamId, long startVersion, ImmutableArray <object> events, TracingProperties tracingProperties = default) { await SaveEvents().ConfigureAwait(continueOnCapturedContext: false); await PublishPendingEvents().ConfigureAwait(continueOnCapturedContext: false); async Task SaveEvents() { using EventStoreContext context = _contextFactory.Invoke(); for (int i = 0; i < events.Length; i++) { object source = events[i]; var streamEvent = new StreamEvent( stateType, streamId, version: startVersion + i, raisedTimeUtc: DateTime.UtcNow, eventType: _typeResolver.ResolveTypeName(source.GetType()), payload: _jsonProcessor.ToJson(source), messageId: $"{Guid.NewGuid()}", tracingProperties.OperationId, tracingProperties.Contributor, tracingProperties.ParentId, transaction); context.Add(streamEvent); context.Add(PendingEvent.Create(streamEvent)); } List <UniqueProperty> uniqueProperties = await context .Set <UniqueProperty>() .Where(p => p.StateType == stateType && p.StreamId == streamId) .AsNoTracking() .ToListAsync() .ConfigureAwait(continueOnCapturedContext: false); foreach ((string name, string value) in GetUniqueProperties(events)) { UniqueProperty property = uniqueProperties.Find(p => p.Name == name); if (value == null) { if (property != null) { context.UniqueProperties.Remove(property); } } else { if (property == null) { context.Add(new UniqueProperty(stateType, streamId, name, value)); } else { property.SetValue(value); context.Update(property); } } } await context.SaveChangesAsync().ConfigureAwait(continueOnCapturedContext: false); } Task PublishPendingEvents() => _publisher.PublishEvents(stateType, streamId); }