public HybridMessageBus(MessageBusSettings settings, HybridMessageBusSettings providerSettings)
        {
            Settings         = settings ?? throw new ArgumentNullException(nameof(settings));
            ProviderSettings = providerSettings ?? throw new ArgumentNullException(nameof(providerSettings));

            // Use the configured logger factory, if not provided try to resolve from DI, if also not available supress logging using the NullLoggerFactory
            LoggerFactory = settings.LoggerFactory
                            ?? (ILoggerFactory)settings.DependencyResolver?.Resolve(typeof(ILoggerFactory))
                            ?? NullLoggerFactory.Instance;

            _logger = LoggerFactory.CreateLogger <HybridMessageBus>();

            _routeByMessageType = new Dictionary <Type, string>();

            _busByName = new Dictionary <string, MessageBusBase>(providerSettings.Count);
            foreach (var name in providerSettings.Keys)
            {
                var builderFunc = providerSettings[name];

                var bus = BuildBus(builderFunc);

                _busByName.Add(name, bus);

                BuildAutoRouting(name, bus);
            }

            // ToDo: defer start of busses until here
        }
        public HybridMessageBus(MessageBusSettings settings, HybridMessageBusSettings providerSettings)
        {
            Settings         = settings;
            ProviderSettings = providerSettings;

            _routeByMessageType = new Dictionary <Type, string>();

            _busByName = new Dictionary <string, MessageBusBase>(providerSettings.Count);
            foreach (var name in providerSettings.Keys)
            {
                var builderFunc = providerSettings[name];

                var bus = BuildBus(builderFunc);

                _busByName.Add(name, bus);

                BuildAutoRouting(name, bus);
            }

            // ToDo: defer start of busses until here
        }
        public IMessageBus CreateMessageBus(IServiceProvider svp)
        {
            var hybridBusSettings = new HybridMessageBusSettings
            {
                // Bus 1
                ["Memory"] = builder =>
                {
                    builder
                    .Produce <CustomerEmailChangedEvent>(x => x.DefaultTopic(x.Settings.MessageType.Name))
                    .Consume <CustomerEmailChangedEvent>(x => x.Topic(x.MessageType.Name).WithConsumer <CustomerChangedEventHandler>())
                    .WithProviderMemory(new MemoryMessageBusSettings {
                        EnableMessageSerialization = false
                    });
                },
                // Bus 2
                ["AzureSB"] = builder =>
                {
                    var serviceBusConnectionString = Secrets.Service.PopulateSecrets(Configuration["Azure:ServiceBus"]);
                    builder
                    .Produce <SendEmailCommand>(x => x.DefaultQueue("test-ping-queue"))
                    .Consume <SendEmailCommand>(x => x.Queue("test-ping-queue").WithConsumer <SmtpEmailService>())
                    .WithProviderServiceBus(new ServiceBusMessageBusSettings(serviceBusConnectionString));
                }
            };

            var mbb = MessageBusBuilder.Create()
                      .WithDependencyResolver(new LookupDependencyResolver(svp.GetRequiredService)) // DI setup will be shared
                      .WithSerializer(new JsonMessageSerializer())                                  // serialization setup will be shared between bus 1 and 2
                      .WithProviderHybrid(hybridBusSettings);

            // In summary:
            // - The CustomerChangedEvent messages will be going through the SMB Memory provider.
            // - The SendEmailCommand messages will be going through the SMB Azure Service Bus provider.
            // - Each of the bus providers will serialize messages using JSON and use the same DI to resolve consumers/handlers.
            var mb = mbb.Build();

            return(mb);
        }
Exemple #4
0
 public static MessageBusBuilder WithProviderHybrid(this MessageBusBuilder mbb, HybridMessageBusSettings hybridSettings)
 {
     return(mbb.WithProvider(settings => new HybridMessageBus(settings, hybridSettings)));
 }