예제 #1
0
        protected BaseRepositoryTest()
        {
            Persistence = new InMemoryPersistence();

            Streams          = new StreamsFactory(Persistence);
            AggregateFactory = new DefaultAggregateFactory();
        }
        public async Task Verify_that_saga_can_be_reloaded_and_have_no_uncommitted_events()
        {
            var orderId = new OrderId(2);
            var sagaId  = orderId;

            var eventStore = await _factory.BuildEventStore(_connectionString).ConfigureAwait(false);

            var streamsFactory = new StreamsFactory(eventStore);
            var repo           = new Repository(new AggregateFactoryEx(_container.Kernel), streamsFactory, new NullSnapshots());

            var saga = await repo.GetByIdAsync <DeliverPizzaSaga>(sagaId).ConfigureAwait(false);

            saga.MessageReceived(new OrderPlaced(orderId));
            saga.MessageReceived(new BillPrinted(orderId));
            saga.MessageReceived(new PaymentReceived(orderId, Guid.NewGuid()));
            saga.MessageReceived(new PizzaDelivered(orderId));

            await repo.SaveAsync(saga, Guid.NewGuid().ToString(), null).ConfigureAwait(false);

            var sagaReloaded = await repo.GetByIdAsync <DeliverPizzaSaga>(sagaId).ConfigureAwait(false);

            Assert.That(sagaReloaded, Is.Not.Null);
            var events = ((IEventSourcedAggregate)saga).GetChangeSet();

            Assert.AreEqual(0, events.Events.Length);
        }
        public async Task repository_does_not_serialize_access_to_the_same_entity()
        {
            var orderId = new OrderId(3);
            var sagaId  = orderId;

            var eventStore = await _factory.BuildEventStore(_connectionString).ConfigureAwait(false);

            var streamsFactory = new StreamsFactory(eventStore);

            var repo1 = new Repository(new AggregateFactoryEx(_container.Kernel), streamsFactory, new NullSnapshots());
            var repo2 = new Repository(new AggregateFactoryEx(_container.Kernel), streamsFactory, new NullSnapshots());

            var saga1 = await repo1.GetByIdAsync <DeliverPizzaSaga>(sagaId).ConfigureAwait(false);

            saga1.MessageReceived(new OrderPlaced(orderId));

            //now create another thread that loads and change the same entity
            var saga2 = repo2.GetByIdAsync <DeliverPizzaSaga>(sagaId).Result;

            saga2.MessageReceived(new OrderPlaced(orderId));
            repo2.SaveAsync(saga2, Guid.NewGuid().ToString(), null).Wait();

            try
            {
                await repo1.SaveAsync(saga1, Guid.NewGuid().ToString(), null).ConfigureAwait(false);

                Assert.Fail("this is supposed to throw due to concurrency exception");
            }
            catch (Exception)
            {
                //Good we are expecting to throw,
            }
        }
        public async Task Verify_that_saga_has_correct_number_of_uncommitted_events()
        {
            var orderId = new OrderId(1);
            var sagaId  = orderId;

            var eventStore = await _factory.BuildEventStore(_connectionString).ConfigureAwait(false);

            var streamsFactory = new StreamsFactory(eventStore);
            var repo           = new Repository(new AggregateFactoryEx(_container.Kernel), streamsFactory, new NullSnapshots());

            var saga = await repo.GetByIdAsync <DeliverPizzaSaga>(sagaId).ConfigureAwait(false);

            saga.MessageReceived(new OrderPlaced(orderId));
            saga.MessageReceived(new BillPrinted(orderId));
            saga.MessageReceived(new PaymentReceived(orderId, Guid.NewGuid()));
            saga.MessageReceived(new PizzaDelivered(orderId));

            //check that uncommitted events are correctly transictioned.
            var events = ((IEventSourcedAggregate)saga).GetChangeSet();

            //Verify that we can save the saga.
            await repo.SaveAsync(saga, Guid.NewGuid().ToString(), null).ConfigureAwait(false);

            Assert.AreEqual(4, events.Events.Length);
        }
        public async Task SetUp()
        {
            _db.Drop();
            _persistence = await _factory.BuildEventStore(_connectionString).ConfigureAwait(false);

            var streamsFactory = new StreamsFactory(_persistence);

            _repo = new Repository(new AggregateFactoryEx(_container.Kernel), streamsFactory, new NullSnapshots());
        }
        protected Changeset ProcessEvent(DomainEvent evt, bool inSameCommitAsPrevious)
        {
            Int64 commitId = inSameCommitAsPrevious ? _lastCommit : ++_lastCommit;

            evt.SetPropertyValue(d => d.AggregateId, new SampleAggregateId(_aggregateIdSeed));
            evt.SetPropertyValue(d => d.CheckpointToken, commitId);
            Changeset cs = new Changeset(_aggregateVersion++, new Object[] { evt });

            var streamFactory = new StreamsFactory(_persistence);
            var stream        = streamFactory.Open(evt.AggregateId);

            stream.AppendAsync(cs).Wait();
            return(cs);
        }
예제 #7
0
파일: Program.cs 프로젝트: heynickc/NStore
        private static async Task streams_api()
        {
            var persister = CreateYourStore();
            var streams   = new StreamsFactory(persister);

            Console.WriteLine("Writing to Stream_1");
            var stream = streams.Open("Stream_1");
            await stream.AppendAsync(new { data = "Hello world!" });

            Console.WriteLine("Reading from Stream_1");
            await stream.ReadAsync(data => {
                Console.WriteLine($"  index {data.Index} => {data.Payload}");
                return(Task.FromResult(true));
            });
        }
예제 #8
0
        public async Task verify_unwind_plain_object()
        {
            var poco          = new PocoObject("TEST", 42);
            var streamFactory = new StreamsFactory(_persistence);
            var stream        = streamFactory.Open("poco/42");
            await stream.AppendAsync(poco).ConfigureAwait(false);

            await sut.UnwindAsync().ConfigureAwait(false);

            var allEvents = sut.UnwindedCollection.FindAll();

            Assert.That(allEvents.CountDocuments(), Is.EqualTo(1));
            var evt = allEvents.Single();

            Assert.That(evt.EventType, Is.EqualTo("PocoObject"));
            Assert.That((evt.GetEvent() as PocoObject).IntValue, Is.EqualTo(42));
            Assert.That((evt.GetEvent() as PocoObject).Value, Is.EqualTo("TEST"));
            Assert.That(evt.PartitionId, Is.EqualTo("poco/42"));
        }
예제 #9
0
        protected void Init()
        {
            var identityConverter = new IdentityManager(new InMemoryCounterService());

            MongoFlatIdSerializerHelper.IdentityConverter = identityConverter;
            identityConverter.RegisterIdentitiesFromAssembly(typeof(SampleId).Assembly);

            var url    = new MongoUrl(ConfigurationManager.ConnectionStrings["readmodel"].ConnectionString);
            var client = new MongoClient(url);

            _db         = client.GetDatabase(url.DatabaseName);
            _collection = GetCollection <SimpleTestAtomicReadModel>();
            _collectionForAtomicAggregate = GetCollection <SimpleAtomicAggregateReadModel>();

            _persistence    = CreatePersistence();
            _streamsFactory = new StreamsFactory(_persistence);
            _db.Drop();

            _identityManager = new IdentityManager(new CounterService(_db));

            GenerateContainer();
            SimpleTestAtomicReadModel.TouchMax = Int32.MaxValue;
        }
예제 #10
0
 public StreamProcessingTests()
 {
     _persistence = new InMemoryPersistence(new InMemoryPersistenceOptions());
     _streams     = new StreamsFactory(_persistence);
     _snapshots   = new DefaultSnapshotStore(new InMemoryPersistence(new InMemoryPersistenceOptions()));
 }
예제 #11
0
 public StreamProcessorManager(IPersistence persistence)
 {
     _streams = new StreamsFactory(persistence);
 }
예제 #12
0
 public void SetUp()
 {
     persistence   = new InMemoryPersistence();
     streamfactory = new StreamsFactory(persistence);
     sut           = new StreamProcessorManager(persistence);
 }