public async Task one_failing_handler_should_not_abort_others()
        {
            var       container      = Substitute.For <IContainer>();
            var       scope          = Substitute.For <IContainerScope>();
            var       evt            = new IocEventBusTests.TestEvent();
            var       successHandler = new IocEventBusTests.SuccessfulHandler();
            Exception actual         = null;

            container.CreateScope().Returns(scope);
            scope.ResolveAll <IApplicationEventSubscriber <IocEventBusTests.TestEvent> >()
            .Returns(new IApplicationEventSubscriber <IocEventBusTests.TestEvent>[]
            {
                new IocEventBusTests.FailingHandler(),
                successHandler
            });
            var inner = new IocEventBus(container);

            var sut = new QueuedEventBus(inner, 1);

            try
            {
                await sut.PublishAsync(evt);

                await sut.ExecuteJobAsync();
            }
            catch (Exception exception)
            {
                actual = exception;
            }


            successHandler.IsCalled.Should().BeTrue();
            actual.Should().BeOfType <AggregateException>();
        }
        public IEventBus CreateEventBus(IContainer container)
        {
            // should not happen, but does sometimes.
            // seems related to Mvc contra WebApi
            // but can't figure out why
            if (_eventBus != null)
            {
                return(_eventBus);
            }

            _registry.ScanAssembly(typeof(ValidateNewLoginHandler).Assembly);
            _registry.ScanAssembly(typeof(UserRepository).Assembly);
            _registry.ScanAssembly(typeof(ScanForNewErrorReports).Assembly);

            //var inner = new SeparateScopesIocEventBus(container, _registry);
            var inner = new IocEventBus(container);

            inner.EventPublished += (sender, args) => CloseUnitOfWorks(args.Scope);
            //inner.ScopeClosing += (sender, args) => CloseUnitOfWorks(args.Scope);
            inner.HandlerFailed += (sender, args) =>
            {
                foreach (var failure in args.Failures)
                {
                    _log.Error(failure.Handler.GetType().FullName + " failed to handle " + args.ApplicationEvent,
                               failure.Exception);
                }
            };

            var bus = new QueuedEventBus(inner, _queueProvider);

            _eventBus = bus;

            return(bus);
        }
        public async Task event_should_report_Failure_if_one_handler_throws_an_exception()
        {
            var container = Substitute.For <IContainer>();
            var scope     = Substitute.For <IContainerScope>();
            var actual    = false;

            container.CreateScope().Returns(scope);
            scope.ResolveAll <IApplicationEventSubscriber <IocEventBusTests.TestEvent> >()
            .Returns(new[]
            {
                Substitute.For <IApplicationEventSubscriber <IocEventBusTests.TestEvent> >(),
                new IocEventBusTests.FailingHandler(),
            });
            var inner = new IocEventBus(container);

            var sut = new QueuedEventBus(inner, 1);

            sut.EventPublished += (sender, args) => actual = args.Successful;
            try
            {
                sut.PublishAsync(new IocEventBusTests.TestEvent());
            }
            catch { }

            actual.Should().BeFalse();
        }
Пример #4
0
 /// <summary>
 ///     Initializes a new instance of the <see cref="IocBusBuilder" /> class.
 /// </summary>
 /// <param name="container">The container.</param>
 public IocBusBuilder(IContainer container)
 {
     if (container == null) throw new ArgumentNullException("container");
     _container = container;
     CommandBus = new IocCommandBus(_container);
     RequestBus = new IocRequestReplyBus(container);
     EventBus = new IocEventBus(container);
     QueryBus = new IocQueryBus(container);
 }
        public async Task works_without_subscribers_since_there_is_no_coupling_between_the_publisher_and_subscribers()
        {
            var container = Substitute.For <IContainer>();
            var scope     = Substitute.For <IContainerScope>();

            container.CreateScope().Returns(scope);
            scope.ResolveAll <IApplicationEventSubscriber <TestEvent> >()
            .Returns(new IApplicationEventSubscriber <TestEvent> [0]);

            var sut = new IocEventBus(container);
            await sut.PublishAsync(new TestEvent());
        }
        public async Task should_dispose_scope_when_done()
        {
            var container = Substitute.For <IContainer>();
            var scope     = Substitute.For <IContainerScope>();

            container.CreateScope().Returns(scope);
            scope.ResolveAll <IApplicationEventSubscriber <TestEvent> >()
            .Returns(new[]
            {
                Substitute.For <IApplicationEventSubscriber <TestEvent> >(),
            });

            var sut = new IocEventBus(container);
            await sut.PublishAsync(new TestEvent());

            scope.Received().Dispose();
        }
        public async Task works_with_multiple_handlers()
        {
            var container   = Substitute.For <IContainer>();
            var scope       = Substitute.For <IContainerScope>();
            var subscriber1 = Substitute.For <IApplicationEventSubscriber <TestEvent> >();
            var subscriber2 = Substitute.For <IApplicationEventSubscriber <TestEvent> >();
            var evt         = new TestEvent();

            container.CreateScope().Returns(scope);
            scope.ResolveAll <IApplicationEventSubscriber <TestEvent> >()
            .Returns(new[] { subscriber1, subscriber2 });

            var sut = new IocEventBus(container);
            await sut.PublishAsync(evt);

            subscriber1.Received().HandleAsync(evt);
            subscriber2.Received().HandleAsync(evt);
        }
        public async Task should_trigger_event_upon_successful_completion()
        {
            var container = Substitute.For <IContainer>();
            var scope     = Substitute.For <IContainerScope>();
            var actual    = false;

            container.CreateScope().Returns(scope);
            scope.ResolveAll <IApplicationEventSubscriber <TestEvent> >()
            .Returns(new[]
            {
                Substitute.For <IApplicationEventSubscriber <TestEvent> >(),
            });

            var sut = new IocEventBus(container);

            sut.EventPublished += (sender, args) => actual = true;
            await sut.PublishAsync(new TestEvent());

            actual.Should().BeTrue();
        }