public MessageBusRabbitMq(
            IRabbitMqPersistentConnection persistentConnection,
            IMessageBusRegistrationsManager messageBusRegistrationsManager,
            ILogger <MessageBusRabbitMq> logger,
            IMessageDeQueuer messageDeQueuer,
            IMessageSerialiser messageSerialiser,
            int retryCount = 5)
        {
            _persistentConnection           = persistentConnection;
            _messageBusRegistrationsManager = messageBusRegistrationsManager;
            _logger            = logger;
            _messageDeQueuer   = messageDeQueuer;
            _messageSerialiser = messageSerialiser;

            _consumerChannel = CreateConsumerChannel();
            _retryCount      = retryCount;
            _messageBusRegistrationsManager.OnMessageRemoved += RegistrationManagerOnMessageRemoved;
        }
Esempio n. 2
0
        public static IServiceCollection UseRabbitMqMessaging(this IServiceCollection services, IConfiguration configuration)
        {
            services.Configure <MessagingBusSettings>(configuration.GetSection(nameof(MessagingBusSettings)));

            services.AddSingleton <IMessageBusRegistrationsManager, InMemoryMessageBusRegistrationsManager>();
            services.AddSingleton <IRabbitMqPersistentConnection>(sp =>
            {
                ILogger <DefaultRabbitMqPersistentConnection> logger = sp.GetRequiredService <ILogger <DefaultRabbitMqPersistentConnection> >();

                IOptions <MessagingBusSettings> messageBusSettingsAccessor = sp.GetRequiredService <IOptions <MessagingBusSettings> >();
                MessagingBusSettings messageBusSettings = messageBusSettingsAccessor.Value;

                ConnectionFactory factory = new ConnectionFactory
                {
                    DispatchConsumersAsync = true,
                    HostName = string.IsNullOrEmpty(messageBusSettings.Connection) ? throw new ArgumentException(nameof(messageBusSettings.Connection)) : messageBusSettings.Connection
                };

                if (!string.IsNullOrEmpty(messageBusSettings.UserName))
                {
                    factory.UserName = messageBusSettings.UserName;
                }

                if (!string.IsNullOrEmpty(messageBusSettings.Password))
                {
                    factory.Password = messageBusSettings.Password;
                }


                int retryCount = messageBusSettings.RetryCount ?? 5;

                return(new DefaultRabbitMqPersistentConnection(factory, logger, retryCount));
            });

            services.AddSingleton <IMessageBus, MessageBusRabbitMq>(sp =>
            {
                ILogger <MessageBusRabbitMq> logger     = sp.GetRequiredService <ILogger <MessageBusRabbitMq> >();
                MessagingBusSettings messageBusSettings = sp.GetRequiredService <IOptions <MessagingBusSettings> >().Value;

                IMessageBusRegistrationsManager eventBusSubcriptionsManager = sp.GetRequiredService <IMessageBusRegistrationsManager>();
                IRabbitMqPersistentConnection rabbitMqPersistentConnection  = sp.GetRequiredService <IRabbitMqPersistentConnection>();
                IMessageDeQueuer messageDeQueuer     = sp.GetRequiredService <IMessageDeQueuer>();
                IMessageSerialiser messageSerialiser = sp.GetRequiredService <IMessageSerialiser>();

                int retryCount = messageBusSettings.RetryCount ?? 5;

                return(new MessageBusRabbitMq(rabbitMqPersistentConnection, eventBusSubcriptionsManager, logger, messageDeQueuer, messageSerialiser, retryCount));
            });

            services.AddSingleton <IMessageHandlerFactory, MessageHandlerFactory>();
            services.AddSingleton <IMessageSerialiser, JsonMessageSerialiser>();

            services.AddSingleton <PendingMessageDirector>();
            services.AddScoped <IPendingMessageContainer>(sp => sp.GetRequiredService <PendingMessageDirector>());
            services.AddScoped <IPendingMessageProvider>(sp => sp.GetRequiredService <PendingMessageDirector>());

            services.AddScoped <IMessageDispatcher, MessageDispatcher>();
            services.AddScoped <IMessageDeQueuer, MessageDeQueuer>();
            services.AddScoped <IMessageSender, MessageSender>();
            services.AddScoped <IMessageFactory, MessageFactory>();

            return(services);
        }