public static ProcessorBuilder<MessagePayload> ToResequencerIfSequenced(
            this ProcessorBuilder<MessagePayload> builder,
            ReceiveMessageCache messageCache,
            ISequenceOptionSchema schema)
        {
            IMessageProcessor<MessagePayload, MessagePayload> processor;
            
            if(schema.IsSequenced)
                processor = new Resequencer(messageCache);    
            else 
                processor = new MessageDecacher(messageCache);

            return builder.ToProcessor(processor);
        }
 void BuildPipeline(PointToPointReceiverChannelSchema schema, ReceiveMessageCache messageCache)
 {
     MessagePipelineBuilder.Build()
         .With(messageReceiver)
         .ToProcessor(new BodyMessageFilter(schema.Address))
         .ToProcessorIf(new NullMessageProcessor(), schema.BlockMessages)
         .ToProcessor(new ReceiverAuthenticationSessionVerifier(authenticationSessionCache, authenticatedServerRegistry))
         .ToProcessor(new MessageRegisteredAddressReassigner(serverAddressRegistry))
         .ToProcessor(new SequenceOriginApplier(messageCache))
         .ToProcessor(new MessageSendTimeRemover())
         .ToProcessor(new ReceiveChannelMessageCacher(messageCache))
         .ToProcessor(new MessageAcknowledger(acknowledgementSender))
         .ToSimpleMessageRepeater(messageCache, systemTime, taskRepeater)
         .ToProcessor(new ReceiveChannelMessageCacher(messageCache))
         .Queue()
         .ToResequencerIfSequenced(messageCache, schema)
         .ToProcessor(new ExceptionHandler(schema.ContinueOnException))
         .ToConverter(new MessagePayloadUnpackager(serialiser))
         .ToProcessor(new MessageFilter(schema.FilterStrategy))
         .ToProcessor(schema.UnitOfWorkRunnerCreator())
         .ToProcessor(new BatchUnpackager())
         .ToEndPoint(messageHandlerRouter);
 }
 public ReceiveChannelMessageCacher(ReceiveMessageCache messageCache)
 {
     Contract.Requires(messageCache != null);
     this.messageCache = messageCache;
 }
 void BuildChannel(MessageProcessor startPoint, RequestRecieveChannelSchema schema, ReceiveMessageCache messageCache)
 {
     MessagePipelineBuilder.Build()
         .With(startPoint)
         .ToProcessorIf(new NullMessageProcessor(), schema.BlockMessages)
         .ToProcessor(new ReceiverAuthenticationSessionVerifier(authenticationSessionCache, authenticatedServerRegistry))
         .ToProcessor(new SequenceOriginApplier(messageCache))
         .ToProcessor(new MessageSendTimeRemover())
         .ToProcessor(new ReceiveChannelMessageCacher(messageCache))
         .ToProcessor(new MessageAcknowledger(acknowledgementSender))
         .ToSimpleMessageRepeater(messageCache, systemTime, taskRepeater)
         .ToProcessor(new ReceiveChannelMessageCacher(messageCache))
         .Queue()
         .ToResequencerIfSequenced(messageCache, schema)
         .ToProcessor(new ReplyChannelSelector(replyAddressLookup, correlationLookup))
         .ToProcessor(new ExceptionReplier(schema.ContinueOnException))
         .ToProcessor(new MessageHookRunner<MessagePayload>(schema.PreUnpackagingHooks))
         .ToConverter(new MessagePayloadUnpackager(serialiser))
         .ToProcessor(new MessageFilter(schema.FilterStrategy))
         .ToProcessor(schema.UnitOfWorkRunnerCreator())
         .ToProcessor(new BatchUnpackager())
         .ToProcessorIf(new MainThreadMessageMashaller(mainThreadMarshaller), schema.HandleRequestsOnMainThread)
         .ToProcessor(new MessageHookRunner<object>(schema.Hooks))
         .ToEndPoint(messageHandlerRouter);
 }
 void BuildPipeline(ReplyReceiveChannelSchema schema, ReceiveMessageCache messageCache)
 {
     MessagePipelineBuilder.Build()
         .With(messageReceiver)
         .ToProcessor(new BodyMessageFilter(schema.Address))
         .ToProcessor(new SenderAuthenticationSessionVerifier(authenticationSessionCache, authenticatedServerRegistry))
         .ToProcessor(new MessageRegisteredAddressReassigner(serverAddressRegistry))
         .ToProcessor(new SequenceOriginApplier(messageCache))
         .ToProcessor(new MessageSendTimeRemover())
         .ToProcessor(new ReceiveChannelMessageCacher(messageCache))
         .ToProcessor(new MessageAcknowledger(acknowledgementSender))
         .ToSimpleMessageRepeater(messageCache, systemTime, taskRepeater)
         .ToProcessor(new ReceiveChannelMessageCacher(messageCache))
         .Queue()
         .ToResequencerIfSequenced(messageCache, schema)
         .ToProcessorIf(new RequestReplyCorrelator(correlationLookup), schema.CorrelateReplyToRequest)
         .ToProcessor(new ExceptionHandler(schema.ContinueOnException))
         .ToConverter(new MessagePayloadUnpackager(serialiser))
         .ToProcessor(schema.UnitOfWorkRunnerCreator())
         .ToProcessor(new BatchUnpackager())
         .ToProcessorIf(new MainThreadMessageMashaller(mainThreadMarshaller), schema.HandleRepliesOnMainThread)
         .ToProcessor(new MessageHookRunner<object>(schema.Hooks))
         .ToEndPoint(messageHandlerRouter);
 }
 public SequenceOriginApplier(ReceiveMessageCache messageCache)
 {
     this.messageCache = messageCache;
 }