/// <inheritdoc /> protected override async Task SaveAsync(VersionableEvent versionableEvent, IDictionary <string, object> headers) { var eventDescriptor = new EventDescriptor(this.AggregateType, this.AggregateId, versionableEvent, headers); await this.documentSession.StoreAsync(eventDescriptor).ConfigureAwait(false); await this.documentSession.SaveChangesAsync().ConfigureAwait(false); }
/// <summary> /// Creates a new instance of <see cref="EventDescriptor"/> /// </summary> /// <param name="aggregateType">The full CLR name of the aggregate root</param> /// <param name="aggregateId">The id of the aggregate root</param> /// <param name="versionableEvent">The versionable event</param> /// <param name="headers">A list of arbitrary headers</param> public EventDescriptor(string aggregateType, Guid aggregateId, VersionableEvent versionableEvent, IDictionary <string, object> headers) { this.AggregateType = aggregateType; this.AggregateId = aggregateId; this.Version = versionableEvent.Version; this.Timestamp = DateTime.Now; this.EventType = versionableEvent.InnerEvent.GetFullName(); this.Event = versionableEvent.InnerEvent; this.Headers = new Dictionary <string, object>(headers); }
public async Task CanSaveAndReplayEvents() { var firstEvent = new VersionableEvent(new ValueEvent(11)).With(1); var secondEvent = new VersionableEvent(new ValueEvent(22)).With(2); var events = new[] { firstEvent, secondEvent }; await this.testee .SaveAsync(events, 1, new Dictionary <string, object>()) .ConfigureAwait(false); var replayedEvents = await this.testee.ReplayAsync().ConfigureAwait(false); replayedEvents.Should().HaveCount(2); replayedEvents.Should().Contain(e => (e as ValueEvent).Value == 11); replayedEvents.Should().Contain(e => (e as ValueEvent).Value == 22); }
/// <inheritdoc /> protected override async Task SaveAsync(VersionableEvent versionableEvent, IDictionary <string, object> headers) { var eventDescriptor = new SqlEventDescriptor(this.AggregateType, this.AggregateId, versionableEvent, headers); using (var connection = await this.factory.CreateAsync(this.connectionStringName).ConfigureAwait(false)) using (var command = new SqlCommand(SqlCommands.InsertEvent, connection)) { command.AddParameter("@AggregateType", eventDescriptor.AggregateType); command.AddParameter("@AggregateId", eventDescriptor.AggregateId); command.AddParameter("@Version", eventDescriptor.Version); command.AddParameter("@Timestamp", eventDescriptor.Timestamp); command.AddParameter("@EventType", eventDescriptor.EventType); command.AddParameter("@EventData", eventDescriptor.SerializedEvent); command.AddParameter("@Headers", eventDescriptor.SerializedHeaders); await command.ExecuteNonQueryAsync().ConfigureAwait(false); } }
public void CanCreateInstanceWithParameters() { var aggregateType = typeof(MyDynamicEventSourcedAggregateRoot).FullName; var aggregateId = Guid.NewGuid(); var versionableEvent = new VersionableEvent(new ValueEvent(11)).With(1); var headers = new Dictionary <string, object> { { "UserName", "Patrick" }, { "MagicNumber", 42 } }; var testee = new EventDescriptor(aggregateType, aggregateId, versionableEvent, headers); testee.AggregateType.Should().Be(aggregateType); testee.AggregateId.Should().Be(aggregateId); testee.Version.Should().Be(1); testee.Timestamp.Should().BeCloseTo(DateTime.Now, 1000); testee.EventType.Should().Be("SimpleDomain.TestDoubles.ValueEvent"); testee.Event.Should().BeSameAs(versionableEvent.InnerEvent); testee.Headers.Should().Contain("UserName", "Patrick").And.Contain("MagicNumber", 42); }
/// <summary> /// Persists a single versionable event /// </summary> /// <param name="versionableEvent">The versionable event</param> /// <param name="headers">A list of arbitrary headers</param> protected abstract Task SaveAsync(VersionableEvent versionableEvent, IDictionary <string, object> headers);
/// <inheritdoc /> protected override Task SaveAsync(VersionableEvent versionableEvent, IDictionary <string, object> headers) { this.eventDescriptors.Add(new EventDescriptor(this.AggregateType, this.AggregateId, versionableEvent, headers)); return(Task.CompletedTask); }
/// <summary> /// Creates a new instance of <see cref="SqlEventDescriptor"/> /// </summary> /// <param name="aggregateType">The full CLR name of the aggregate root</param> /// <param name="aggregateId">The id of the aggregate root</param> /// <param name="versionableEvent">The versionable event</param> /// <param name="headers">A list of arbitrary headers</param> public SqlEventDescriptor(string aggregateType, Guid aggregateId, VersionableEvent versionableEvent, IDictionary <string, object> headers) : base(aggregateType, aggregateId, versionableEvent, headers) { this.SerializedEvent = JsonConvert.SerializeObject(versionableEvent.InnerEvent); this.SerializedHeaders = JsonConvert.SerializeObject(headers); }