Esempio n. 1
0
        public void SelectManyDecorator_Test()
        {
            var count = 0;

            var notification = new TestChainBuilderNotifier();
            var services     = new ChainBuilderSetupServices(notification);
            var builder      = new ChainBuilder <OuterMessage>();

            builder.SelectMany(m => m.Messages).Skip(2).Take(2).Handler(m => count++);
            var chain = builder.BuildFunc(services);

            Assert.False(notification.IsDisposed);
            Assert.Equal(0, count);

            chain(
                new OuterMessage
            {
                Messages = new[] { 1, 2, 3 }
            },
                CancellationToken.None);

            Assert.False(notification.IsDisposed);
            Assert.Equal(1, count);

            chain(
                new OuterMessage
            {
                Messages = new[] { 4, 5, 6 }
            },
                CancellationToken.None);

            Assert.Equal(2, count);
            Assert.True(notification.IsDisposed);
        }
Esempio n. 2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ParallelMessageHandlerChainPublisher{TMessageType}"/> class.
        /// </summary>
        /// <param name="ChainBuilder">
        /// The message handler chain builder
        /// </param>
        public ParallelMessageHandlerChainPublisher(ChainBuilder <MessageAndHandler <TMessageType> > ChainBuilder)
        {
            ChainBuilder.Handler(this.PublishAsync);

            var subscriptionNotification = new ChainBuilderNotifier();
            var services = new ChainBuilderSetupServices(subscriptionNotification);

            this.publisher = ChainBuilder.BuildFunc(services);

            var chain = new Chain <MessageAndHandler <TMessageType> >(this.publisher);

            subscriptionNotification.Notify(chain);
        }
Esempio n. 3
0
        public void ChainBuilt(IChain chain)
        {
            this.parentChain = chain;

            foreach (var branch in this.branches)
            {
                var builder = new ChainBuilder <TMessageType>();
                branch(builder);

                var notifier  = new ChainBuilderNotifier();
                var services  = new ChainBuilderSetupServices(notifier);
                var chainFunc = builder.BuildFunc(services);

                this.handlers.Add(chainFunc);

                var newChain = new Chain <TMessageType>(chainFunc, () => this.Unsubscribe(chainFunc));
                notifier.Notify(newChain);
            }
        }
        private static BusOptions <TMessageType> UseSubscriptionChain <TMessageType>(
            BusOptions <TMessageType> options,
            ChainBuilder <MessageAndHandler <TMessageType> > builder)
        {
            if (builder.HasHandler == false)
            {
                builder.Handler(PublishToSubscription.PublishAsync);
            }

            var subscriptionNotification = new ChainBuilderNotifier();
            var services  = new ChainBuilderSetupServices(subscriptionNotification);
            var chainFunc = builder.BuildFunc(services);
            var newChain  = new Chain <MessageAndHandler <TMessageType> >(chainFunc);

            subscriptionNotification.Notify(newChain);

            options.UseCustomPublisher(new ParallelMessageHandlerChainPublisher <TMessageType>(chainFunc));
            return(options);
        }
Esempio n. 5
0
        /// <summary>
        ///     Create a message handler chain to set up a subscription
        /// </summary>
        /// <typeparam name="TMessageType">The message type</typeparam>
        /// <param name="subscriptions">The subscriptions interface</param>
        /// <param name="setupAction">The method called to configure the message handler chain for the new subscription</param>
        /// <returns>The new message handler chain</returns>
        public static IChain <TMessageType> Subscribe <TMessageType>(
            this IMessageBusSubscriptions <TMessageType> subscriptions,
            Action <IChainBuilder <TMessageType> > setupAction)
        {
            var builder = new ChainBuilder <TMessageType>();

            setupAction(builder);

            var subscriptionNotification = new ChainBuilderNotifier();
            var services  = new ChainBuilderSetupServices(subscriptionNotification);
            var chainFunc = builder.BuildFunc(services);

            var subscription = subscriptions.Subscribe(chainFunc);

            var chain = new Chain <TMessageType>(chainFunc, subscription.Dispose);

            subscriptionNotification.Notify(chain);

            return(chain);
        }