Ejemplo n.º 1
0
        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");
        }