Beispiel #1
0
        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>());
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #4
0
        /// <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
                });
            }
        }