Example #1
0
        void SaveEvents(int numberOfCommandsToProcess, string aggregateRootId)
        {
            var eventStore     = new MongoDbEventStore(_database, "Events");
            var serializer     = new JsonDomainEventSerializer();
            var typeNameMapper = new DefaultDomainTypeNameMapper();

            Enumerable.Range(0, numberOfCommandsToProcess)
            .ToList()
            .ForEach(number =>
            {
                var domainEvents = new[]
                {
                    new RootGotNewNumber(number)
                    {
                        Meta =
                        {
                            { DomainEvent.MetadataKeys.AggregateRootId, aggregateRootId                                  },
                            { DomainEvent.MetadataKeys.SequenceNumber,  number.ToString()                                },
                            { DomainEvent.MetadataKeys.TimeUtc,         Time.UtcNow().ToString("u")                      },
                            { DomainEvent.MetadataKeys.Type,            typeNameMapper.GetName(typeof(RootGotNewNumber)) },
                            { DomainEvent.MetadataKeys.Owner,           typeNameMapper.GetName(typeof(Root))             },
                        }
                    }
                };

                eventStore.Save(Guid.NewGuid(), domainEvents.Select(e => serializer.Serialize(e)));
            });
        }
        public void IndexSpeedTest(bool useIndexes, int numberOfQueries, int numberOfEvents)
        {
            var sequenceNumbers = new Dictionary <string, long>();
            var serializer      = new JsonDomainEventSerializer();

            try
            {
                var database = MongoHelper.InitializeTestDatabase();
                database.Drop();
                var eventStore = new MongoDbEventStore(database, "events", automaticallyCreateIndexes: useIndexes);

                var random           = new Random(DateTime.Now.GetHashCode());
                var aggregateRootIds = Enumerable.Range(0, 1000).Select(i => i.ToString()).ToArray();

                Func <string, long> getNextSequenceNumber = id => !sequenceNumbers.ContainsKey(id) ? (sequenceNumbers[id] = 0) : ++sequenceNumbers[id];
                Func <string>       randomAggregateRootId = () => aggregateRootIds[random.Next(aggregateRootIds.Length)];

                var events = Enumerable.Range(1, numberOfEvents)
                             .Select(i => Event(getNextSequenceNumber, randomAggregateRootId()))
                             .ToList();

                TakeTime("Insert " + events.Count + " events", () =>
                {
                    foreach (var e in events)
                    {
                        eventStore.Save(Guid.NewGuid(), new[] { serializer.Serialize(e) });
                    }
                });

                TakeTime("Execute " + numberOfQueries + " queries", () => numberOfQueries.Times(() => eventStore.Load(randomAggregateRootId()).ToList()));
            }
            finally
            {
                Console.WriteLine(@"This is how far we got:
{0}", string.Join(Environment.NewLine, sequenceNumbers.Select(kvp => string.Format("    {0}: {1}", kvp.Key, kvp.Value))));
            }
        }
Example #3
0
        public void Save_ValidEvent_EventCanBeRetreived()
        {
            // Arrange
            var correlationIdHelper = new CorrelationIdHelper(new ContextItemCollectionFactory());

            correlationIdHelper.SetCorrelationId(Guid.NewGuid());
            var logger = new ConsoleLogger(new LoggerSettings(), correlationIdHelper);

            try
            {
                // Arrange
                var connectionStringFactory = new TestMongoEventStoreConnectionStringFactory();
                TestMongoEventStoreConnectionStringFactory.DatabaseName = string.Format("Test-{0}", new Random().Next(0, 9999));

                var eventStore = new MongoDbEventStore <Guid>(new MongoDbEventBuilder <Guid>(), new MongoDbEventDeserialiser <Guid>(), logger, connectionStringFactory, new ConfigurationManager());

                var event1 = new TestEvent
                {
                    Rsn           = Guid.NewGuid(),
                    Id            = Guid.NewGuid(),
                    CorrelationId = correlationIdHelper.GetCorrelationId(),
                    Frameworks    = new List <string> {
                        "Test 1"
                    },
                    TimeStamp = DateTimeOffset.UtcNow
                };
                var event2 = new TestEvent
                {
                    Rsn           = Guid.NewGuid(),
                    Id            = Guid.NewGuid(),
                    CorrelationId = correlationIdHelper.GetCorrelationId(),
                    Frameworks    = new List <string> {
                        "Test 2"
                    },
                    TimeStamp = DateTimeOffset.UtcNow
                };

                // Act
                eventStore.Save <TestEvent>(event1);
                eventStore.Save <TestEvent>(event2);

                // Assert
                var timer = new Stopwatch();
                IList <IEvent <Guid> > events = eventStore.Get <TestEvent>(event1.Id).ToList();
                timer.Stop();
                Console.WriteLine("Load one operation took {0}", timer.Elapsed);
                Assert.AreEqual(1, events.Count);
                Assert.AreEqual(event1.Id, events.Single().Id);
                Assert.AreEqual(event1.Frameworks.Single(), events.Single().Frameworks.Single());

                timer.Restart();
                events = eventStore.Get <TestEvent>(event2.Id).ToList();
                timer.Stop();
                Console.WriteLine("Load one operation took {0}", timer.Elapsed);
                Assert.AreEqual(1, events.Count);
                Assert.AreEqual(event2.Id, events.Single().Id);
                Assert.AreEqual(event2.Frameworks.Single(), events.Single().Frameworks.Single());

                timer.Restart();
                IList <EventData> correlatedEvents = eventStore.Get(event1.CorrelationId).ToList();
                timer.Stop();
                Console.WriteLine("Load several correlated operation took {0}", timer.Elapsed);
                Assert.AreEqual(2, correlatedEvents.Count);
            }
            finally
            {
                // Clean-up
                TestMongoDataStoreConnectionStringFactory.DatabaseName = TestMongoEventStoreConnectionStringFactory.DatabaseName;
                var factory = new TestMongoDbDataStoreFactory(logger, new TestMongoDataStoreConnectionStringFactory());
                IMongoCollection <TestEvent> collection = factory.GetTestEventCollection();
                collection.Database.Client.DropDatabase(TestMongoDataStoreConnectionStringFactory.DatabaseName);
            }
        }
Example #4
0
 public void SaveEvent <TDomainEvent, TAggregateRoot>(TDomainEvent e)
     where TAggregateRoot : AggregateRoot, new()
     where TDomainEvent : DomainEvent <TAggregateRoot>
 {
     _eventStore.Save(Guid.NewGuid(), new[] { _domainEventSerializer.Serialize(e) });
 }