Esempio n. 1
0
        private App()
        {
            var settings = new DefaultHandlerSettings(
                new HandlerModule(),
                new DefaultRequestTypeResolver("cedar", Enumerable.Empty <Type>()));

            var commitDispatcherFailed = new TaskCompletionSource <Exception>();

            //MidFunc blah = CommandHandlingMiddleware.HandleCommands(settings);
            //_middleware = CreateGate(commitDispatcherFailed.Task)
            _middleware  = CommandHandlingMiddleware.HandleCommands(settings);
            _storeEvents = Wireup.Init().UsingInMemoryPersistence().Build();
            var eventStoreClient = new EventStoreClient(_storeEvents.Advanced);

            _durableCommitDispatcher = new DurableCommitDispatcher(
                eventStoreClient,
                new InMemoryCheckpointRepository(),
                new HandlerModule(),
                TransientExceptionRetryPolicy.Indefinite(TimeSpan.FromMilliseconds(500)));

            _durableCommitDispatcher.ProjectedCommits.Subscribe(
                _ => { },
                commitDispatcherFailed.SetResult);

            _durableCommitDispatcher.Start().Wait();
        }
        public async Task When_new_commit_then_should_dispatch()
        {
            using (IStoreEvents eventStore = Wireup.Init().UsingInMemoryPersistence().Build())
            {
                var dispatchedEvents = new List<EventMessage<TestEvent>>();
                var handlerModule = new TestHandlerModule(dispatchedEvents);

                using(var host = new DurableCommitDispatcher(
                    new EventStoreClient(eventStore.Advanced),
                    new InMemoryCheckpointRepository(),
                    new HandlerResolver(handlerModule)))
                {
                    var projectedCommits = host
                        .ProjectedCommits
                        .Replay();

                    using(projectedCommits.Connect())
                    {
                        await host.Start();

                        var streamId = Guid.NewGuid().ToString().FormatStreamIdWithBucket();

                        Guid commitId = Guid.NewGuid();

                        Task<ICommit> commitProjected = projectedCommits
                            .Take(1)
                            .ToTask();

                        using(IEventStream stream = eventStore.CreateStream(streamId))
                        {
                            stream.Add(new global::NEventStore.EventMessage { Body = new TestEvent() });
                            stream.CommitChanges(commitId);
                        }
                        host.PollNow();
                        await commitProjected;

                        dispatchedEvents.Count.Should().Be(1);
                        dispatchedEvents[0].Commit().Should().NotBeNull();
                        dispatchedEvents[0].Headers.Should().NotBeNull();
                        dispatchedEvents[0].Version.Should().Be(1);
                        dispatchedEvents[0].DomainEvent.Should().BeOfType<TestEvent>();
                    }
                }
            }
        }
        public async Task When_handler_throws_Then_invoke_exception_callback()
        {
            using (IStoreEvents eventStore = Wireup.Init().UsingInMemoryPersistence().Build())
            {
                var projectedEvents = new List<EventMessage<TestEvent>>();
                var handlerModule = new TestHandlerModule(projectedEvents);

                using (var host = new DurableCommitDispatcher(
                    new EventStoreClient(eventStore.Advanced),
                    new InMemoryCheckpointRepository(),
                    new HandlerResolver(handlerModule)))
                {
                    var projectedCommits = host
                        .ProjectedCommits
                        .Replay();

                    using(projectedCommits.Connect())
                    {
                        await host.Start();

                        var streamId = Guid.NewGuid().ToString().FormatStreamIdWithBucket();

                        Guid commitId = Guid.NewGuid();

                        Task<ICommit> commitProjected = projectedCommits
                            .Take(1)
                            .ToTask();

                        using(IEventStream stream = eventStore.CreateStream(streamId))
                        {
                            stream.Add(new global::NEventStore.EventMessage { Body = new TestEventThatThrows() });
                            stream.CommitChanges(commitId);
                        }
                        host.PollNow();

                        Func<Task> act = async () => await commitProjected;

                        act.ShouldThrow<Exception>();
                    }
                }
            }
        }