Exemple #1
0
        public EventStoreProjectorRegistry(ILoggerFactory loggerFactory
                                           , EventStoreConnectionProvider connectionProvider
                                           , IServiceProvider serviceProvider
                                           , IEntityStore entityStore
                                           , ICacheClient cache
                                           , IOptions <ProjectionOptions> options
                                           )
        {
            if (serviceProvider == null)
            {
                throw new ArgumentNullException(nameof(serviceProvider));
            }

            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            _loggerFactory      = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
            _connectionProvider = connectionProvider ?? throw new ArgumentNullException(nameof(connectionProvider));

            _logger      = loggerFactory.CreateLogger(GetType());
            _projectors  = serviceProvider.GetServices <IReadModelProjector>();
            _entityStore = entityStore ?? throw new ArgumentNullException(nameof(entityStore));
            _cache       = cache ?? throw new ArgumentNullException(nameof(cache));
            _options     = options.Value;
        }
Exemple #2
0
        public async Task <Nothing> AppendAsync(
            AggregateId aggregateId,
            IReadOnlyList <IDomainEvent> domainEvents,
            long expectedVersion)
        {
            if (domainEvents.Count > 0)
            {
                var connection = await EventStoreConnectionProvider.GrabSingleEventStoreConnectionFor(_connectionString);

                var results = await connection.ConditionalAppendToStreamAsync(
                    aggregateId.ToStreamName(_eventStoreName),
                    expectedVersion,
                    domainEvents.Select(e => e.ToEventData()));

                switch (results.Status)
                {
                case ConditionalWriteStatus.Succeeded:
                    break;

                case ConditionalWriteStatus.VersionMismatch:
                    throw new VersionMismatchException(aggregateId.ToStreamName(_eventStoreName), expectedVersion);

                case ConditionalWriteStatus.StreamDeleted:
                    throw new StreamDeletedException(aggregateId.ToStreamName(_eventStoreName));

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            return(Nothing.NotAtAll);
        }
        public async Task write_events_to_stream()
        {
            var connectionProvider = new EventStoreConnectionProvider(Options.Create(_fixture.EventStoreConnectionOptions));

            var aggregateId = Guid.NewGuid();
            var streamId    =
                StreamIdBuilder.Create()
                .WithAggregateId(aggregateId)
                .WithAggregateType <DummyAggregate>()
                .Build();

            var writeEvents = new List <Event> {
                new DummyCreatedEvent(aggregateId, "The name", "https://url.example.com"),
                new DummyNameChangedEvent(aggregateId, "The new name"),
                new DummyUrlChangedEvent(aggregateId, "https://newurl.example.com")
            };

            var sut = new EventStoreStreamWriter(connectionProvider, _serializer);
            await sut.AppendEventsToStream(streamId, writeEvents);

            var reader = new EventStoreStreamReader(connectionProvider, _serializer);

            var count      = 0;
            var enumerator = reader.ReadAllEventsFromStreamAsync(streamId).GetAsyncEnumerator();

            while (await enumerator.MoveNextAsync())
            {
                count++;
            }
            await enumerator.DisposeAsync();

            count.Should().Be(3);
        }
        public async Task write_events_to_stream_when_expected_version_matches()
        {
            var connectionProvider = new EventStoreConnectionProvider(Options.Create(_fixture.EventStoreConnectionOptions));

            var aggregateId = Guid.NewGuid();
            var streamId    =
                StreamIdBuilder.Create()
                .WithAggregateId(aggregateId)
                .WithAggregateType <DummyAggregate>()
                .Build();

            var writeEvents = new List <Event> {
                new DummyCreatedEvent(aggregateId, "The name", "https://url.example.com"),
                new DummyNameChangedEvent(aggregateId, "The new name"),
                new DummyUrlChangedEvent(aggregateId, "https://newurl.example.com")
            };

            var sut = new EventStoreStreamWriter(connectionProvider, _serializer);
            await sut.AppendEventsToStream(streamId, writeEvents);

            var changeEvent = new DummyUrlChangedEvent(aggregateId, "https://newnewurl.example.com");
            await sut.AppendEventsToStream(streamId, new List <Event> {
                changeEvent
            }, 2);
        }
        public async Task throw_on_write_when_expected_version_does_not_match()
        {
            var connectionProvider = new EventStoreConnectionProvider(Options.Create(_fixture.EventStoreConnectionOptions));

            var aggregateId = Guid.NewGuid();
            var streamId    =
                StreamIdBuilder.Create()
                .WithAggregateId(aggregateId)
                .WithAggregateType <DummyAggregate>()
                .Build();

            var writeEvents = new List <Event> {
                new DummyCreatedEvent(aggregateId, "The name", "https://url.example.com"),
                new DummyNameChangedEvent(aggregateId, "The new name"),
                new DummyUrlChangedEvent(aggregateId, "https://newurl.example.com")
            };

            //Write 3 events to the stream, this sets the version to 2
            var sut = new EventStoreStreamWriter(connectionProvider, _serializer);
            await sut.AppendEventsToStream(streamId, writeEvents);

            //Write should fail
            var changeEvent = new DummyUrlChangedEvent(aggregateId, "https://newnewurl.example.com");
            await Assert.ThrowsAsync <WrongExpectedVersionException>(
                async() => await sut.AppendEventsToStream(streamId, new List <Event> {
                changeEvent
            }, 1));
        }
Exemple #6
0
        private static void TestConnection(IEventStoreConfiguration config)
        {
            var connectionProvider = new EventStoreConnectionProvider(config);

            connectionProvider.SetConnectionSettingsBuilder(
                () => ConnectionSettings.Create()
                .FailOnNoServerResponse()
                .SetDefaultUserCredentials(new UserCredentials("Inforigami.Regalo.EventStore", "changeit")));

            var connection = connectionProvider.GetConnection();

            Assert.DoesNotThrow(() => connection.ConnectAsync().Wait());
            Assert.DoesNotThrow(
                () =>
            {
                try
                {
                    connection.ReadAllEventsForwardAsync(Position.Start, 512, false).Wait();
                }
                catch (AggregateException e)
                {
                    if (e.InnerExceptions.Any(x => x is AccessDeniedException))
                    {
                        throw new InvalidOperationException(
                            "Unable to authenticate with the eventstore instance at 'localhost:1113'. Ensure there is an admin user "
                            + "configured called 'Inforigami.Regalo.EventStore', with password 'changeit'.", e);
                    }
                }
            });
        }
        public EventStoreProjectionContext(ILoggerFactory loggerFactory
                                           , EventStoreConnectionProvider connectionProvider
                                           , IEntityStore entityStore
                                           , IReadModelProjector projector
                                           // , bool useQueue
                                           , string projectorId
                                           )
        {
            _loggerFactory      = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
            _logger             = loggerFactory.CreateLogger(GetType());
            _connectionProvider = connectionProvider ?? throw new ArgumentNullException(nameof(connectionProvider));
            _entityStore        = entityStore ?? throw new ArgumentNullException(nameof(entityStore));
            _projector          = projector ?? throw new ArgumentNullException(nameof(projector));
            // _useQueue = useQueue;

            StreamName = projector.StreamName;

            if (string.IsNullOrEmpty(StreamName))
            {
                throw new InvalidOperationException("no stream name in projector " + projector.GetType().FullName);
            }

            ProjectorId = projectorId;

            // if (_useQueue)
            // {
            //     Queue = new InMemoryQueue<ProjectionEventData>(new InMemoryQueueOptions<ProjectionEventData>
            //     {
            //         LoggerFactory = loggerFactory
            //     });
            // }
        }
Exemple #8
0
        public async Task <IReadOnlyList <IDomainEvent> > AsyncLoadAllEventsFor(AggregateId aggregateId)
        {
            var connection = await EventStoreConnectionProvider.GrabSingleEventStoreConnectionFor(_connectionString);

            var resolvedEvents = await connection.ReadAllStreamEventsForward(aggregateId.ToStreamName(_eventStoreName));

            return(resolvedEvents.Select(e => e.Event.ToDomainEvent()).ToList());
        }
Exemple #9
0
 public EventStoreReader(EventStoreConnectionProvider provider, ILoggerFactory loggerFactory)
 {
     if (loggerFactory == null)
     {
         throw new ArgumentNullException(nameof(loggerFactory));
     }
     _logger   = loggerFactory.CreateLogger(GetType());
     _provider = provider ?? throw new ArgumentNullException(nameof(provider));
 }
Exemple #10
0
        public PersistentSubscriptionAdapter(EventStoreConnectionProvider connectionProvider, IApplicationLifetime applicationLifetime)
        {
            if (applicationLifetime == null)
            {
                throw new ArgumentNullException(nameof(applicationLifetime));
            }

            _connectionProvider = connectionProvider ?? throw new ArgumentNullException(nameof(connectionProvider));
            _cancellationToken  = applicationLifetime.ApplicationStopping;
        }
        private EventRepository <T> CreateRepository <T>()
            where T : AggregateRoot
        {
            var connectionProvider = new EventStoreConnectionProvider(Options.Create(_fixture.EventStoreConnectionOptions));

            var reader = new EventStoreStreamReader(connectionProvider, _serializer);
            var writer = new EventStoreStreamWriter(connectionProvider, _serializer);

            var sut = new EventRepository <T>(writer, reader);

            return(sut);
        }
Exemple #12
0
        private IEventStoreSubscription EventStoreSubscriptionFrom(string streamName, long lastCheckpoint)
        {
            var connection  = EventStoreConnectionProvider.GrabSingleEventStoreConnectionFor(_connectionString).Result;
            var eventStream = new BlockingCollection <IDomainEvent>();

            var catchUpSubscription = connection.SubscribeToStreamFrom(
                streamName,
                lastCheckpoint == 0 ? (long?)null : lastCheckpoint,
                CatchUpSubscriptionSettings.Default,
                (_, x) => eventStream.Add(x.Event.ToDomainEvent()));

            return(new EventStoreSubscription(catchUpSubscription, eventStream));
        }
Exemple #13
0
 public DomainEventStore(ILoggerFactory loggerFactory
                         , EventStoreConnectionProvider provider
                         , Func <Type, string, string> aggregateIdToStreamName
                         )
 {
     if (loggerFactory == null)
     {
         throw new ArgumentNullException(nameof(loggerFactory));
     }
     _logger   = loggerFactory.CreateLogger(GetType());
     _provider = provider ?? throw new ArgumentNullException(nameof(provider));
     _aggregateIdToStreamName = aggregateIdToStreamName ??
                                throw new ArgumentNullException(nameof(aggregateIdToStreamName));
 }
        public EventStoreProjectionContext(ILoggerFactory loggerFactory
                                           , EventStoreConnectionProvider connectionProvider
                                           , IEntityStore entityStore
                                           , IReadModelProjector projector
                                           )
        {
            _loggerFactory      = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
            _logger             = loggerFactory.CreateLogger(GetType());
            _connectionProvider = connectionProvider ?? throw new ArgumentNullException(nameof(connectionProvider));
            _entityStore        = entityStore ?? throw new ArgumentNullException(nameof(entityStore));
            _projector          = projector ?? throw new ArgumentNullException(nameof(projector));

            //Queue = new InMemoryQueue<ProjectionEventData>(new InMemoryQueueOptions<ProjectionEventData>()
            //{
            //    LoggerFactory = loggerFactory
            //});
            //Queue.StartWorkingAsync(HandleAsync);
        }
        public async Task Throw_stream_not_found_exception_if_stream_does_not_exist()
        {
            var connectionProvider = new EventStoreConnectionProvider(Options.Create(_fixture.EventStoreConnectionOptions));

            var aggregateId = Guid.NewGuid();
            var streamId    =
                StreamIdBuilder.Create()
                .WithAggregateId(aggregateId)
                .WithAggregateType <DummyAggregate>()
                .Build();

            var reader = new EventStoreStreamReader(connectionProvider, _serializer);
            await Assert.ThrowsAsync <StreamNotFoundException>(async() =>
            {
                var enumerator = reader.ReadAllEventsFromStreamAsync(streamId).GetAsyncEnumerator();
                while (await enumerator.MoveNextAsync())
                {
                    ;
                }
                await enumerator.DisposeAsync();
            });
        }
        private IEventStreamReader CreateStreamReader()
        {
            var connectionProvider = new EventStoreConnectionProvider(Options.Create(_fixture.EventStoreConnectionOptions));

            return(new EventStoreStreamReader(connectionProvider, _serializer));
        }
Exemple #17
0
 public DomainEventStore(ILoggerFactory loggerFactory, EventStoreConnectionProvider provider) : this(loggerFactory, provider,
                                                                                                     Util.AggregateIdToStreamName) //, Util.EventTypeToEventName)
 {
 }
Exemple #18
0
 public PersistentSubscriptionFactory(EventStoreConnectionProvider connectionProvider, IHostApplicationLifetime applicationLifetime)
 {
     _connectionProvider  = connectionProvider ?? throw new ArgumentNullException(nameof(connectionProvider));
     _applicationLifetime = applicationLifetime ?? throw new ArgumentNullException(nameof(applicationLifetime));
 }