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);
Example #3
0
        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");
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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));
        }