Exemplo n.º 1
0
        public EndToEndTests()
        {
            //This path is used to save in memory storage
            var strTempDataFolderPath = AppDomain.CurrentDomain.BaseDirectory + @"App_Data\";

            //create temp directory if it doesn't exist
            new FileInfo(strTempDataFolderPath).Directory?.Create();

            var inMemoryEventStorePath    = $@"{strTempDataFolderPath}events.stream.dump";
            var inMemorySnapshotStorePath = $@"{strTempDataFolderPath}events.snapshot.dump";

            File.Delete(inMemoryEventStorePath);
            File.Delete(inMemorySnapshotStorePath);

            IEventStorageProvider <Guid> eventStorage =
                new InMemoryEventStorageProvider(inMemoryEventStorePath);

            ISnapshotStorageProvider <Guid> snapshotStorage =
                new InMemorySnapshotStorageProvider(SnapshotFrequency, inMemorySnapshotStorePath);

            _clock               = new MockClock();
            _eventPublisher      = new MockEventPublisher();
            _repository          = new Repository <Schedule, ScheduleSnapshot, Guid, Guid, Guid>(_clock, eventStorage, _eventPublisher, snapshotStorage);
            _eventOnlyRepository = new EventOnlyRepository <Schedule, Guid, Guid>(_clock, eventStorage, _eventPublisher);
        }
Exemplo n.º 2
0
        private static async Task RunAsync()
        {
            //This path is used to save in memory storage
            string strTempDataFolderPath = AppDomain.CurrentDomain.BaseDirectory + @"App_Data\";

            //create temp directory if it doesn't exist
            new FileInfo(strTempDataFolderPath).Directory?.Create();

            var inMemoryEventStorePath     = $@"{strTempDataFolderPath}events.stream.dump";
            var inMemorySnapshotStorePath  = $@"{strTempDataFolderPath}events.snapshot.dump";
            var inMemoryReadModelStorePath = $@"{strTempDataFolderPath}events.readmodel.dump";

            File.Delete(inMemoryEventStorePath);
            File.Delete(inMemorySnapshotStorePath);
            File.Delete(inMemoryReadModelStorePath);

            IClock clock = new MyClock();

            IEventStorageProvider <Guid, Schedule, Guid> eventStorage =
                new InMemoryEventStorageProvider <Guid, Schedule, Guid>(inMemoryEventStorePath);

            ISnapshotStorageProvider <ScheduleSnapshot, Guid, Guid> snapshotStorage =
                new InMemorySnapshotStorageProvider <ScheduleSnapshot, Guid, Guid>(2, inMemorySnapshotStorePath);

            IEventPublisher <Guid, Schedule, Guid> eventPublisher = new EventPublisher <Guid, Schedule, Guid>();

            IRepository <Schedule, Guid, Guid> repository =
                new Repository <Schedule, Guid, Guid, ScheduleSnapshot, Guid>(clock, eventStorage, eventPublisher, snapshotStorage);

            // repository = new EventOnlyRepository<Schedule, Guid, Guid>(clock, eventStorage, eventPublisher);

            var schedule = new Schedule("test schedule");
            await repository.SaveAsync(schedule);

            schedule = await repository.GetByIdAsync(schedule.Id);

            schedule.AddTodo("test todo 1");
            await repository.SaveAsync(schedule);

            schedule = await repository.GetByIdAsync(schedule.Id);

            schedule.AddTodo("test todo 2");
            await repository.SaveAsync(schedule);

            schedule = await repository.GetByIdAsync(schedule.Id);

            schedule.AddTodo("test todo 3");
            await repository.SaveAsync(schedule);

            schedule = await repository.GetByIdAsync(schedule.Id);

            var todo = schedule.Todos.First();

            schedule.UpdateTodo(todo.Id, todo.Text + " updated");
            await repository.SaveAsync(schedule);

            schedule = await repository.GetByIdAsync(schedule.Id);

            todo = schedule.Todos.Last();
            await schedule.CompleteTodoAsync(todo.Id);

            await repository.SaveAsync(schedule);

            Console.WriteLine();
            Console.WriteLine("Schedule loaded from Repository:");
            Console.WriteLine(JsonConvert.SerializeObject(schedule, Formatting.Indented));
        }
Exemplo n.º 3
0
        private async Task BuildEventStore(IServiceCollection services)
        {
            //Create EventStore Connection
            var eventStoreConnection = EventStoreConnection.Create(
                Configuration["EventStore:ConnectionString"],
                ConnectionSettings.Create()
                .KeepReconnecting()
                .EnableVerboseLogging()
                .SetHeartbeatInterval(TimeSpan.FromMilliseconds(5 * 1000))
                .UseDebugLogger(),
                Environment.ApplicationName
                );

            eventStoreConnection.Connected += (sender, args)
                                              => Console.WriteLine($"Connection to {args.RemoteEndPoint} event store established.");

            eventStoreConnection.ErrorOccurred += (sender, args)
                                                  => Console.WriteLine($"Connection error : {args.Exception}");

            await eventStoreConnection.ConnectAsync();


            var serializer = new JsonNetSerializer();

            var eventMapper = new EventTypeMapper()
                              .Map <Domain.Events.V1.ReviewCreated>("reviewCreated")
                              .Map <Domain.Events.V1.CaptionAndContentChanged>("reviewUpdated")
                              .Map <Domain.Events.V1.ReviewPublished>("reviewPublished")
                              .Map <Domain.Events.V1.ReviewApproved>("reviewApproved")
                              .Map <Domain.ReviewSnapshot>("reviewSnapshot");


            var aggregateStore = new GesAggrigateStore(
                eventStoreConnection,
                serializer,
                eventMapper,
                (type, id) => $"{type.Name}-{id}",
                null);

            var gesSnapshotStore = new GesSnapshotStore(eventStoreConnection,
                                                        serializer,
                                                        eventMapper,
                                                        (type, id) => $"{type.Name}-{id}",
                                                        null);


            var inMemorySnapshotStore = new InMemorySnapshotStorageProvider("memoryDumpFile.dats");

            var redisSnapshotStore = new RedisSnapshotStoreProvider(Configuration["RedisStore:ConnectionString"]);

            var repository = new Repository(aggregateStore, gesSnapshotStore);

            services.AddSingleton <IRepository>(repository);

            services.AddSingleton(new ApplicationService(repository));

            IAsyncDocumentSession GetSession() => BuildRevenDb().OpenAsyncSession();

            await ProjectionManager.With
            .Connection(eventStoreConnection)
            .CheckpointStore(new RavenDbChecklpointStore(GetSession))
            .Serializer(serializer)
            .TypeMapper(eventMapper)
            .SetProjections(new Projection[]
            {
                new ActiveReviews(GetSession),
                new ReviewsByOwner(GetSession)
            })
            .StartAll();
        }