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();
		}
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #7
0
 public CartsController()
 {
     _eventStream = new EventStore.EventStore(new IPEndPoint(IPAddress.Loopback, 1113));
 }