IPipe <ConsumerConsumeContext <TConsumer, TMessage> > BuildConsumerPipe <T>(IPipeSpecification <ConsumerConsumeContext <T> >[] pipeSpecifications) where T : class { var builder = new ConsumerPipeBuilder <T>(); for (int i = 0; i < pipeSpecifications.Length; i++) { pipeSpecifications[i].Apply(builder); } var builders = builder as ConsumerPipeBuilder <TConsumer>; if (builders == null) { throw new InvalidOperationException("Should not be null, ever"); } return(Pipe.New <ConsumerConsumeContext <TConsumer, TMessage> >(x => { foreach (var filter in builders.Filters) { x.UseFilter(filter); } x.UseFilter(_consumeFilter); })); }
ConnectHandle IConsumerConnector.ConnectConsumer <T>(IConsumePipeConnector consumePipe, IConsumerFactory <T> consumerFactory, IPipeSpecification <ConsumerConsumeContext <T> >[] pipeSpecifications) { var factory = consumerFactory as IConsumerFactory <TConsumer>; if (factory == null) { throw new ArgumentException("The consumer factory type does not match: " + TypeMetadataCache <T> .ShortName); } IPipe <ConsumerConsumeContext <TConsumer, TMessage> > consumerPipe = ConsumerPipeBuilder.BuildConsumerPipe(_consumeFilter, pipeSpecifications); IPipe <ConsumeContext <TMessage> > messagePipe = MessagePipeBuilder.BuildMessagePipe <TConsumer, TMessage, T>(pipeSpecifications, new ConsumerMessageFilter <TConsumer, TMessage>(factory, consumerPipe)); return(consumePipe.ConnectConsumePipe(messagePipe)); }
public void Configure(IReceiveEndpointBuilder builder) { var builders = new ConsumerPipeBuilder <RoutingSlip>(); for (int i = 0; i < _pipeSpecifications.Count; i++) { _pipeSpecifications[i].Apply(builders); } IPipe <ConsumeContext <RoutingSlip> > messagePipe = Pipe.New <ConsumeContext <RoutingSlip> >(x => { foreach (var filter in builders.Filters) { x.UseFilter(filter); } x.UseFilter(_filterFactory()); }); builder.ConnectConsumePipe(messagePipe); }
ConnectHandle IConsumerConnector.ConnectConsumer <T>(IConsumePipeConnector consumePipe, IConsumerFactory <T> consumerFactory, IPipeSpecification <ConsumerConsumeContext <T> >[] pipeSpecifications) { var factory = consumerFactory as IConsumerFactory <TConsumer>; if (factory == null) { throw new ArgumentException("The consumer factory type does not match: " + TypeMetadataCache <T> .ShortName); } var builder = new ConsumerPipeBuilder <T>(); for (int i = 0; i < pipeSpecifications.Length; i++) { pipeSpecifications[i].Apply(builder); } var builders = builder as ConsumerPipeBuilder <TConsumer>; if (builders == null) { throw new InvalidOperationException("Should not be null, ever"); } IPipe <ConsumerConsumeContext <TConsumer, TMessage> > messagePipe = Pipe.New <ConsumerConsumeContext <TConsumer, TMessage> >(x => { foreach (var filter in builders.Filters) { x.UseFilter(filter); } x.UseFilter(_consumeFilter); }); IPipe <ConsumeContext <TMessage> > pipe = Pipe.New <ConsumeContext <TMessage> >(x => x.UseFilter(new ConsumerMessageFilter <TConsumer, TMessage>(factory, messagePipe))); return(consumePipe.ConnectConsumePipe(pipe)); }
ConnectHandle IInstanceConnector.ConnectInstance <T>(IConsumePipeConnector consumePipe, T instance, IPipeSpecification <ConsumerConsumeContext <T> >[] pipeSpecifications) { if (instance == null) { throw new ArgumentNullException(nameof(instance)); } var consumer = instance as TConsumer; if (consumer == null) { throw new ConsumerException( $"The instance type {instance.GetType().GetTypeName()} does not match the consumer type: {TypeMetadataCache<TConsumer>.ShortName}"); } IPipe <ConsumerConsumeContext <TConsumer, TMessage> > consumerPipe = ConsumerPipeBuilder.BuildConsumerPipe(_consumeFilter, pipeSpecifications); IPipe <ConsumeContext <TMessage> > messagePipe = MessagePipeBuilder.BuildMessagePipe <TConsumer, TMessage, T>(pipeSpecifications, new InstanceMessageFilter <TConsumer, TMessage>(consumer, consumerPipe)); return(consumePipe.ConnectConsumePipe(messagePipe)); }