public async Task Save <T>(T aggregate, long expectedVersion = -1, EventMetadata metadata = null) where T : AggregateRoot <TId> { await _store.ConnectWithContext(async (IEventStoreConnection connection, ActionContext context) => { context.Logger.Information($"Writing changes for Aggregate {aggregate.GetType().Name} ({aggregate.Id}) to the event store."); var changes = aggregate.GetUncommittedChanges(); context.Logger.Trace($"{changes.Count()} changes pending..."); var serializedChanges = changes.Select(e => { var m = metadata != null ? EventMetadata.FromMetadataTemplate(metadata, expectedVersion) : new EventMetadata(_sourceApp, version: expectedVersion); var meta = JsonConvert.SerializeObject(m); var body = JsonConvert.SerializeObject(e); return(new { m.Id, Type = e.GetType().Name, Body = body, Meta = meta }); }); context.State.SetParam("changes", serializedChanges); var data = serializedChanges.Select(change => new EventData(change.Id, change.Type, true, Encoding.ASCII.GetBytes(change.Body), Encoding.ASCII.GetBytes(change.Meta))); var result = await connection.AppendToStreamAsync($"{aggregate.GetType().Name}-{aggregate.Id}", expectedVersion, data); context.Logger.Debug("The changes were written to the event store successfully. Clearing the list."); aggregate.MarkChangesAsCommitted(); }, "Save"); }