public static void UseCorrelationMiddleware(this IPipeConfigurator <ConsumeContext> configurator, IServiceProvider serviceProvider) { var scopeProvider = new DependencyInjectionConsumerScopeProvider(serviceProvider); configurator.AddPipeSpecification(new FilterPipeSpecification <ConsumeContext>(new ScopeFilter(scopeProvider))); configurator.AddPipeSpecification(new CorrelationSpecification <ConsumeContext>()); }
/// <summary> /// Creates a scope which is used by all downstream filters/consumers/etc. /// </summary> /// <param name="configurator"></param> /// <param name="serviceProvider"></param> public static void UseServiceScope(this IPipeConfigurator <ConsumeContext> configurator, IServiceProvider serviceProvider) { var scopeProvider = new DependencyInjectionConsumerScopeProvider(serviceProvider); var specification = new FilterPipeSpecification <ConsumeContext>(new ScopeConsumeFilter(scopeProvider)); configurator.AddPipeSpecification(specification); }
/// <summary> /// Registers a consumer which is resolved from the service provider, within a container scope /// </summary> /// <typeparam name="T">The consumer type</typeparam> /// <param name="configurator">The service bus configurator</param> /// <param name="serviceProvider">The LifetimeScope of the container</param> /// <param name="configure">Configure the consumer (optional)</param> /// <returns></returns> public static void Consumer <T>(this IReceiveEndpointConfigurator configurator, IServiceProvider serviceProvider, Action <IConsumerConfigurator <T> > configure = null) where T : class, IConsumer { IConsumerScopeProvider scopeProvider = new DependencyInjectionConsumerScopeProvider(serviceProvider); var consumerFactory = new ScopeConsumerFactory <T>(scopeProvider); configurator.Consumer(consumerFactory, configure); }
/// <summary> /// Connect a consumer with a consumer factory method /// </summary> /// <typeparam name="TConsumer"></typeparam> /// <typeparam name="TMessage"></typeparam> /// <param name="configurator"></param> /// <param name="provider"></param> /// <param name="configure"></param> /// <returns></returns> public static void Consumer <TConsumer, TMessage>(this IBatchConfigurator <TMessage> configurator, IServiceProvider provider, Action <IConsumerMessageConfigurator <TConsumer, Batch <TMessage> > > configure = null) where TConsumer : class, IConsumer <Batch <TMessage> > where TMessage : class { IConsumerScopeProvider scopeProvider = new DependencyInjectionConsumerScopeProvider(provider); IConsumerFactory <TConsumer> consumerFactory = new ScopeConsumerFactory <TConsumer>(scopeProvider); configurator.Consumer(consumerFactory, configure); }
/// <summary> /// Connect a consumer to the bus/mediator /// </summary> /// <typeparam name="TConsumer"></typeparam> /// <param name="connector"></param> /// <param name="provider"></param> /// <param name="pipeSpecifications"></param> /// <returns></returns> public static ConnectHandle ConnectConsumer <TConsumer>(this IConsumePipeConnector connector, IServiceProvider provider, params IPipeSpecification <ConsumerConsumeContext <TConsumer> >[] pipeSpecifications) where TConsumer : class, IConsumer { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } IConsumerScopeProvider scopeProvider = new DependencyInjectionConsumerScopeProvider(provider); IConsumerFactory <TConsumer> consumerFactory = new ScopeConsumerFactory <TConsumer>(scopeProvider); return(connector.ConnectConsumer(consumerFactory, pipeSpecifications)); }
public static void CreateBackplaneEndpoints <T>(this IBusFactoryConfigurator configurator, IServiceProvider serviceProvider, IHost host, IReadOnlyDictionary <Type, IReadOnlyList <Type> > hubConsumers, Action <T> configureEndpoint = null) where T : class, IReceiveEndpointConfigurator { var factoryType = typeof(ScopeConsumerFactory <>); var consumerConfiguratorType = typeof(ConsumerConfigurator <>); foreach (var hub in hubConsumers) { var queueNameBase = host.Topology.CreateTemporaryQueueName($"signalRBackplane-{hub.Key.Name}-"); // Loop through our 5 hub consumers and create a temporary endpoint for each foreach (var consumer in hub.Value) { // remove `1 from generic type var name = consumer.Name; int index = name.IndexOf('`'); if (index > 0) { name = name.Remove(index); } configurator.ReceiveEndpoint($"{queueNameBase}{name}-", e => { configureEndpoint?.Invoke((T)e); IConsumerScopeProvider scopeProvider = new DependencyInjectionConsumerScopeProvider(serviceProvider); var concreteFactoryType = factoryType.MakeGenericType(consumer); var consumerFactory = Activator.CreateInstance(concreteFactoryType, scopeProvider); var concreteConsumerConfiguratorType = consumerConfiguratorType.MakeGenericType(consumer); var consumerConfigurator = Activator.CreateInstance(concreteConsumerConfiguratorType, consumerFactory, e); e.AddEndpointSpecification((IReceiveEndpointSpecification)consumerConfigurator); }); } } }
static void Main(string[] args) { IServiceProvider container = null; var configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json", true, true) .Build(); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger(); Log.Information("Starting Receiver..."); var services = new ServiceCollection(); services.AddScoped <ScopedObject>(); services.AddMassTransit(x => { x.AddConsumer <DoSomeWorkConsumer>(); }); services.AddSingleton(context => Bus.Factory.CreateUsingRabbitMq(x => { IRabbitMqHost host = x.Host(new Uri("rabbitmq://*****:*****@localhost:5672/test"), h => { }); x.ReceiveEndpoint(host, $"receiver_queue", e => { var scopeProvider = new DependencyInjectionConsumerScopeProvider(container); // Workable solution!!! e.Consumer(new ScopeConsumerFactory <DoSomeWorkConsumer>(scopeProvider), cfg => cfg.UseFilter(new InjectContextFilter <DoSomeWorkConsumer>())); // Workable solution!!! //e.Consumer(new ScopeConsumerFactory<DoSomeWorkConsumer>(scopeProvider), cfg => cfg.ConsumerMessage<DoSomeWork>(m => m.UseFilter(new InjectContextFilter<DoSomeWorkConsumer, DoSomeWork>()))); //e.LoadFrom(container); }); x.UseSerilog(); })); container = services.BuildServiceProvider(); var busControl = container.GetRequiredService <IBusControl>(); busControl.Start(); Log.Information("Receiver started..."); for (var i = 1; i <= 10; i++) { var correlationId = NewId.NextGuid(); Log.Information($"{i}: CorrelationId: {correlationId}"); busControl.Publish <DoSomeWork>(new { Id = NewId.NextGuid(), CorrelationId = correlationId }); } }