Esempio n. 1
0
        public void Subscribe <TEvent, THandler>()
            where THandler : IEventHandler <TEvent>
            where TEvent : Event
        {
            var channel = connectionProvider.GetConnection().CreateModel();

            var exchangeName = nameProvider.GetExchangeName <TEvent>();
            var queueName    = nameProvider.GetQueueName <TEvent, THandler>();

            channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout);
            channel.QueueDeclare(queueName);
            channel.QueueBind(queueName, exchangeName, string.Empty);

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += (_, ea) =>
            {
                var message = messageProvider.GetEvent(ea.Body.ToArray(), typeof(TEvent)) as TEvent;
                var handler = handlerProvider.GetRequiredService <TEvent>(typeof(THandler));
                handler.ProcessAsync(message);
            };

            channel.BasicConsume(queueName, true, consumer);
            subscriptionManager.Subscribe <TEvent, THandler>(channel);
        }