public async Task TestAddEvent() { // Arrange var eventStore = new EventStore.EventStore(_context, _provider, _provider.GetService <IEventDataFactory <EventData, Guid, Guid> >()); var aggregateId = Guid.NewGuid(); const int version = 0; const int secondVersion = 1; const int expectedVersion = 2; var expectedEventId = Guid.NewGuid(); var secondExpectedEventId = Guid.NewGuid(); const string updatedValue = "test"; var creationEvent = new TestCreatedEvent(expectedEventId, aggregateId, version); var updatedEvent = new UpdatedTestEvent(secondExpectedEventId, aggregateId, secondVersion, updatedValue); // Act await eventStore.AddEventAsync(creationEvent); await eventStore.AddEventAsync(updatedEvent); var aggregate = await eventStore.GetAggregateAsync <TestAggregate>(aggregateId); // Assert Assert.NotNull(eventStore); Assert.NotNull(aggregate); Assert.IsType <TestAggregate>(aggregate); Assert.Equal(updatedValue, aggregate.TestProperty); Assert.Equal(expectedVersion, aggregate.Version); }
public async Task TestCreateEvent() { // Arrange var eventStore = new EventStore.EventStore(_context, _provider, _provider.GetService <IEventDataFactory <EventData, Guid, Guid> >()); var aggregateId = Guid.NewGuid(); const int expectedVersion = 0; var expectedEventId = Guid.NewGuid(); var creationEvent = new TestCreatedEvent(expectedEventId, aggregateId, expectedVersion); // Act await eventStore.AddEventAsync(creationEvent); var events = eventStore.GetAllEvents(); var testEvents = events as IList <IEvent <Guid, Guid> > ?? events.ToList(); var testEvent = testEvents.First(); //var resultingAggregate = await eventStore.GetAsync<TestAggregate>(aggregateId); // Assert Assert.NotNull(eventStore); Assert.Equal(1, testEvents.Count); Assert.IsAssignableFrom <IEvent>(testEvent); Assert.IsType <TestCreatedEvent>(testEvent); Assert.Equal(aggregateId, testEvent.AggregateId); Assert.Equal(expectedVersion, testEvent.Version); Assert.Equal(expectedEventId, testEvent.Id); }
/// <summary> /// Add events to an existing appender, events in order will be serialized as a single bytestream. /// </summary> /// <param name="dest">appender</param> /// <param name="source">events to add</param> /// <paramref name="serializer">serializer, default binary</paramref> public static void AddEvents(this IAppendOnlyStore dest, IEnumerable<IEvent> source, IEventSerializer serializer = null) { if (dest == null) { throw new ArgumentNullException("dest"); } if (source == null) { throw new ArgumentNullException("source"); } var es = new EventStore.EventStore(dest, serializer ?? new BinaryFormatterSerializer()); var events = source as IEvent[] ?? source.ToArray(); var versions = new Dictionary<IIdentity, int>(); List<IEvent> stack = new List<IEvent>(); Action savestack = () => { if (!versions.ContainsKey(stack[0].AggregateId)) { versions[stack[0].AggregateId] = 0; } es.AppendToStream(stack[0].AggregateId, versions[stack[0].AggregateId], stack); versions[stack[0].AggregateId]++; stack.Clear(); }; if (events.Any()) { IIdentity lastid = null; foreach (var e in events) { if (stack.Any() && !lastid.Equals(e.AggregateId)) { savestack(); } //else { stack.Add(e); lastid = e.AggregateId; } } } savestack(); }
private static ContractCommandHandlers GetCommandHandler() { var configurationBuilder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); var environment = Environment.GetEnvironmentVariable("NETCORE_ENVIRONMENT"); var isDevelopment = string.Equals(environment, "development", StringComparison.OrdinalIgnoreCase); if (isDevelopment) { configurationBuilder.AddUserSecrets(Assembly.GetCallingAssembly()); } var configuration = configurationBuilder.Build(); Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .Enrich.FromLogContext() .Enrich.With <CorrelationLogEventEnricher>() .WriteTo.MSSqlServer(configuration.GetConnectionString("Logs"), "Logs", autoCreateSqlTable: true) .CreateLogger(); var loggerFactory = new LoggerFactory(); loggerFactory.AddSerilog(); var stanConnectionProvider = new StanConnectionProvider(configuration, new Logger <StanConnectionProvider>(loggerFactory), null); var topicRegistry = new DefaultTopicRegistry(configuration); var messageTypeRegistry = new DefaultMessageTypeRegistry(); var messageSerdes = new NewtonsoftJsonMessageSerDes(messageTypeRegistry); var messagingTopicPublisher = new NatsMessagingTopicPublisher(stanConnectionProvider, new Logger <NatsMessagingTopicPublisher>(loggerFactory)); var messageBusPublisher = new MessageBusPublisher(messagingTopicPublisher, topicRegistry, messageSerdes, configuration); var scripts = new Scripts(); var eventRepository = new AdoNetEventRepository(scripts, new Logger <AdoNetEventRepository>(loggerFactory), new Options()); var eventStoreSerDes = new NewtonsoftJsonEventStoreSerDes(); var eventStore = new EventStore.EventStore(eventRepository, eventStoreSerDes, new Logger <EventStore.EventStore>(loggerFactory)); var eventStoreDecorator = new MessagingEventStoreDecorator(eventStore, messageBusPublisher, new MessagingTopicResolver(new Options())); var mediator = new OpenFaaSMediator(configuration, new Logger <OpenFaaSMediator>(loggerFactory)); var repository = new EventSourcedRepository <Contract>(eventStoreDecorator, null, mediator, new EventSourcingOptions(), new Logger <EventSourcedRepository <Contract> >(loggerFactory)); var result = new ContractCommandHandlers(repository); //disposables = new List<IDisposable>{stanConnectionProvider}; return(result); }
public Solution(IEventRepository eventRepository, ISnapshotRepository snapshotRepository) { var eventStore = new EventStore.EventStore(eventRepository); var snapshotStore = new SnapshotStore(snapshotRepository); var serviceCollection = new ServiceCollection(); serviceCollection.AddSingleton <SolutionContext>(); serviceCollection.AddSingleton <ICommandBus>(new CommandBus(eventStore)); serviceCollection.AddSingleton <IQueryBus>(new QueryBus()); serviceCollection.AddSingleton <IEventBus>(new EventBus()); serviceCollection.AddSingleton <IEventStore>(eventStore); serviceCollection.AddSingleton <ISnapshotStore>(snapshotStore); ServiceProvider = serviceCollection.BuildServiceProvider(); ProjectorFactory.Init(EventStore); }
public async Task TestGetVersion() { // Arrange var eventStore = new EventStore.EventStore(_context, _provider, _provider.GetService <IEventDataFactory <EventData, Guid, Guid> >()); var aggregateId = Guid.NewGuid(); const int version = 0; const int secondVersion = 1; const int expectedVersion = 2; var expectedEventId = Guid.NewGuid(); var secondExpectedEventId = Guid.NewGuid(); const string updatedValue = "test"; var creationEvent = new TestCreatedEvent(expectedEventId, aggregateId, version); var updatedEvent = new UpdatedTestEvent(secondExpectedEventId, aggregateId, secondVersion, updatedValue); // Act await eventStore.AddEventAsync(creationEvent); await eventStore.AddEventAsync(updatedEvent); int resultingVersion = await eventStore.GetAggregateVersionAsync(aggregateId); // Assert Assert.Equal(expectedVersion, resultingVersion); }
public CartsController() { _eventStream = new EventStore.EventStore(new IPEndPoint(IPAddress.Loopback, 1113)); }