private static void ConfigureBus(
            this IServiceCollectionBusConfigurator busConfigurator,
            string?queueName,
            MessagingOptions options)
        {
            if (options.Transport == MessagingTransport.InMemory)
            {
                busConfigurator.AddBus(provider => Bus.Factory.CreateUsingInMemory(cfg =>
                {
                    cfg.ReceiveEndpoint(e =>
                    {
                        e.ConfigureConsumers(provider);
                    });
                }));
            }
            else
            {
                busConfigurator.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    cfg.Host(options.ServiceBus.Host, c =>
                    {
                        c.Username(options.ServiceBus.Username);
                        c.Password(options.ServiceBus.Password);
                    });

                    cfg.ReceiveEndpoint(queueName, e =>
                    {
                        e.ConfigureConsumers(provider);
                    });
                }));
            };
        }
        private static void CreateConfigForAzureServiceBus(IServiceCollection services, IServiceCollectionBusConfigurator config, List <ConsumerAssemblyTypeModel> consumerAssemblyTypes)
        {
            config.AddBus(provider => Bus.Factory.CreateUsingAzureServiceBus(busFactoryConfig =>
            {
                var connectionString = services.GetValue <string>("AzureServiceBusConnectionString");

                busFactoryConfig.Host(connectionString);
                consumerAssemblyTypes
                .GroupBy(assembly => assembly.MessageType)
                .Select(assemblyGroup => new
                {
                    MessageType   = assemblyGroup.Key,
                    ConsumerTypes = assemblyGroup.Select(assembly => assembly.ConsumerType).ToList()
                })
                .ToList()
                .ForEach(assembly =>
                {
                    busFactoryConfig.GetType()
                    .GetMethod(nameof(busFactoryConfig.SubscriptionEndpoint), 1, new Type[] {
                        typeof(string),
                        typeof(Action <IServiceBusSubscriptionEndpointConfigurator>)
                    })
                    .MakeGenericMethod(assembly.MessageType)
                    .Invoke(busFactoryConfig, new object[] {
                        assembly.MessageType.Name,
                        new Action <IServiceBusSubscriptionEndpointConfigurator>(consumerConfig =>
                        {
                            var registerConsumerMethod = typeof(DependencyInjectionReceiveEndpointExtensions)
                                                         .GetMethods()
                                                         .Where(m => m.IsGenericMethod && m.GetGenericArguments().Length == 1)
                                                         .First();

                            assembly.ConsumerTypes.ForEach(consumerType =>
                            {
                                registerConsumerMethod.MakeGenericMethod(consumerType)
                                .Invoke(null, new object[] { consumerConfig, null });
                            });
                        })
                    });
                });
            }));
        }
        // TODO: Provide configuration for handle RabbitMq Host/Username/Password
        private static void CreateConfigForRabbitMq(IServiceCollection services, IServiceCollectionBusConfigurator configurator, List <ConsumerAssemblyTypeModel> consumerAssemblyTypes)
        {
            var serviceConfigModel = services.GetOptions <ServiceConfigurationModel>("Service");

            configurator.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(busFactoryConfig =>
            {
                busFactoryConfig.Host("workflowmanager.rabbitmq", "/", h =>
                {
                    h.Username("guest");
                    h.Password("guest");
                });

                var serviceConfigModel = services.GetOptions <ServiceConfigurationModel>("Service");
                consumerAssemblyTypes.ForEach(assemblyType =>
                {
                    busFactoryConfig.ReceiveEndpoint($"{serviceConfigModel.Name}_{assemblyType.MessageType.Name}", cfg =>
                    {
                        cfg.Consumer(assemblyType.ConsumerType, (Type type) => provider.GetService(type));
                    });
                });
            }));
        }
Beispiel #4
0
 private static void ConfigureServices(IServiceCollectionBusConfigurator services)
 {
     services.AddConsumer <ExecuteReportConsumer>();
     services.AddBus(CreateBus);
 }