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); }
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)); }
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(); }