public override IEnumerable <IEvent> Save <TAggregate>(TAggregate aggregate) { var tableName = aggregate.GetType().Name; var table = _tableClient.GetTableReference(tableName); table.CreateIfNotExists(); var events = aggregate.UncommitedEvents().ToList(); foreach (var evt in aggregate.UncommitedEvents()) { var formattedVersion = evt.Version.ToString("D10"); var tableEntity = new EventAzureTableEntity { AggregateId = aggregate.Id.ToString(), PartitionKey = aggregate.Id.ToString(), RowKey = formattedVersion, CreatedAt = _timeProvider.GetCurrentTime().ToString("o"), ClrType = evt.GetType().AssemblyQualifiedName, TypeName = evt.GetType().Name, Payload = JsonConvert.SerializeObject(evt) }; var insertOperation = TableOperation.Insert(tableEntity); try { // Execute the insert operation. table.Execute(insertOperation); } catch (Exception ex) { if (ex.Message.Contains("409")) { throw new AggregateConflictException(aggregate.Id, evt.Version); } throw; } } return(events); }
private static IEvent DeserializeAzureEntity(EventAzureTableEntity tableEntity) { return(JsonConvert.DeserializeObject(tableEntity.Payload, Type.GetType(tableEntity.ClrType)) as IEvent); }