public async Task <TAggregate> GetAsync <TAggregate, TState>(string id) where TAggregate : Aggregate <TState> where TState : IAggregateState, new() { var events = await _eventStore.GetEventsAsync(StreamId.From(id)); if (!events.Any()) { return(default);
public async Task <TAggregate> GetAsync <TAggregate, TState>(string id, CancellationToken cancellationToken = default) where TAggregate : Aggregate <TState> where TState : IAggregateState, new() { cancellationToken.ThrowIfCancellationRequested(); var events = await _eventStore.GetEventsAsync(StreamId.From(id)); if (!events.Any()) { return(default);
public void WhenSavingNullEventsThenShouldThrowArgumentNullException() { var dbContextFactory = new Mock <IDbContextFactory>().Object; var eventContextFactory = new Mock <IEventContextFactory>().Object; var eventModelFactory = new Mock <IEventModelFactory>().Object; var eventTypeCache = new Mock <IEventTypeCache>().Object; var logger = new Mock <ILogger <EntityFrameworkCoreEventStore> >().Object; var store = new EntityFrameworkCoreEventStore(dbContextFactory: dbContextFactory, eventContextFactory: eventContextFactory, eventModelFactory: eventModelFactory, eventTypeCache: eventTypeCache, logger: logger); IEnumerable <IEventContext <IEvent> > contexts = null; Func <Task> act = async() => await store.SaveAsync(StreamId.From("fake-stream"), contexts); act.Should().Throw <ArgumentNullException>(). And.ParamName.Should().Be("events"); }
public async Task WhenSavingSingleEventThenShouldStoreEvent() { var dbContext = _serviceProvider.GetRequiredService <IDbContextFactory>().Create(); var store = _serviceProvider.GetRequiredService <IEventStore>(); var serializer = _serviceProvider.GetRequiredService <IEventSerializer>(); var factory = _serviceProvider.GetRequiredService <IAggregateFactory>(); var id = Guid.NewGuid().ToSequentialGuid(); var aggregate = factory.FromHistory <FakeAggregate, FakeAggregateState>(Enumerable.Empty <IEvent>()); aggregate.FakeAction(); var contexts = aggregate.GetUncommittedEvents().Select(@event => new EventContext <IEvent>(streamId: aggregate.Id, @event: @event, correlationId: null, causationId: null, timestamp: DateTimeOffset.UtcNow, actor: Actor.From(nameof(WhenSavingSingleEventThenShouldStoreEvent)))); await store.SaveAsync(StreamId.From(aggregate.Id), contexts); var count = dbContext.Events.Count(e => e.StreamId == StreamId.From(aggregate.Id)); count.Should().Be(1); }
public async Task WhenAggregateHasEventsThenGetAsyncWithOffsetShouldReturnExpectedEvents() { var store = _serviceProvider.GetRequiredService <IEventStore>(); var factory = _serviceProvider.GetRequiredService <IAggregateFactory>(); var aggregate = factory.FromHistory <FakeAggregate, FakeAggregateState>(Enumerable.Empty <IEvent>()); aggregate.FakeAction(); aggregate.FakeAction(); aggregate.FakeAction(); aggregate.FakeAction(); aggregate.FakeAction(); var contexts = aggregate.GetUncommittedEvents().Select(@event => new EventContext <IEvent>(streamId: aggregate.Id, @event: @event, correlationId: null, causationId: null, timestamp: DateTimeOffset.UtcNow, actor: Actor.From(nameof(WhenAggregateHasEventsThenGetAsyncWithOffsetShouldReturnExpectedEvents)))); await store.SaveAsync(StreamId.From(aggregate.Id), contexts); var events = await store.GetEventsAsync(StreamId.From(aggregate.Id), 3); events.Count().Should().Be(3); }
public async Task <TView> ProjectAsync(string subject, DateTimeOffset timestamp, CancellationToken cancellationToken = default) { if (cancellationToken.IsCancellationRequested) { _logger.LogInformation($"{nameof(InMemoryProjector<TView>)}.{nameof(ProjectAsync)} was cancelled before execution"); cancellationToken.ThrowIfCancellationRequested(); } var events = await _eventStore.GetEventsAsync(StreamId.From(subject), timestamp, cancellationToken); var writer = await InMemoryProjectionWriter <TView> .BuildAsync(cancellationToken); var manager = _projectionManagerFactory.Create(writer); foreach (var @event in events) { await manager.HandleAsync(@event.Payload, cancellationToken); } return(await writer.RetrieveAsync(subject, cancellationToken)); }