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); }