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); }
/// <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); }
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); }
/// <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); }