Skip to content

DependencyInjection

cgcel edited this page Jan 30, 2024 · 10 revisions

Catalog

Description

NanoRabbit is designed as a easy-to-register library.

Before Use

NanoRabbit is a Lightweight RabbitMQ .NET 3rd party library for .NET 6 and up, which is not including the management API of RabbitMQ, so you should deploy your own RabbitMQ and configure all the Users, Virtual Hosts, Exchanges, Queues before you start using NanoRabbit.

Injection Extensions

The only thing you need to do is inject NanoRabbit in Program.cs follow the below steps:

  1. Register RabbitProducer
  2. Register RabbitConsumer
  3. Register RabbitSubscriber

RabbitProducer DependencyInjection

Inject RabbitProducer in Program.cs:

var builder = Host.CreateApplicationBuilder(args);

builder.Services.AddRabbitProducer(options =>
{
    options.AddProducer(new ProducerOptions
    {
        ProducerName = "FooFirstQueueProducer",
        HostName = "localhost",
        Port = 5672,
        UserName = "admin",
        Password = "admin",
        VirtualHost = "FooHost",
        ExchangeName = "amq.topic",
        RoutingKey = "FooFirstKey",
        Type = ExchangeType.Topic,
        Durable = true,
        AutoDelete = false,
        Arguments = null,
        AutomaticRecoveryEnabled = true
    });
    options.AddProducer(new ProducerOptions
    {
        ProducerName = "BarFirstQueueProducer",
        HostName = "localhost",
        Port = 5672,
        UserName = "admin",
        Password = "admin",
        VirtualHost = "BarHost",
        ExchangeName = "amq.direct",
        RoutingKey = "BarFirstKey",
        Type = ExchangeType.Direct,
        Durable = true,
        AutoDelete = false,
        Arguments = null,
        AutomaticRecoveryEnabled = true
    });
});

After injection, you can use RabbitProducer in the project, for example, create a BackgroundService, named "PublishService.cs":

public class PublishService : BackgroundService
{
    private readonly RabbitProducer _producer;

    public PublishService(RabbitProducer producer)
    {
        _producer = producer;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _producer.Publish("FooFirstQueueProducer", "Hello from conn1");
            _producer.Publish("BarFirstQueueProducer", "Hello from conn2");
            await Task.Delay(1000, stoppingToken);
        }
    }
}

Then, add this BackgroundService at Program.cs:

builder.Services.AddHostedService<PublishService>();

RabbitConsumer DependencyInjection

var builder = Host.CreateApplicationBuilder(args);

builder.Services.AddRabbitConsumer(options =>
{
    options.AddConsumer(new ConsumerOptions
    {
        ConsumerName = "FooFirstQueueConsumer",
        HostName = "localhost",
        Port = 5672,
        UserName = "admin",
        Password = "admin",
        VirtualHost = "FooHost",
        QueueName = "FooFirstQueue",
        AutomaticRecoveryEnabled = true
    });
    options.AddConsumer(new ConsumerOptions
    {
        ConsumerName = "BarFirstQueueConsumer",
        HostName = "localhost",
        Port = 5672,
        UserName = "admin",
        Password = "admin",
        VirtualHost = "BarHost",
        QueueName = "BarFirstQueue", AutomaticRecoveryEnabled = true
    });
});

After injection, you can use RabbitConsumer in the project, for example, create a BackgroundService, named "ConsumeService.cs":

public class ConsumeService : BackgroundService
{
    private readonly RabbitConsumer _consumer;

    public ConsumeService(RabbitConsumer consumer)
    {
        _consumer = consumer;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _consumer.Receive("FooFirstQueueConsumer", message => { Console.WriteLine(message); });
            await Task.Delay(1000, stoppingToken);
        }
    }

    public override Task StopAsync(CancellationToken cancellationToken)
    {
        return base.StartAsync(cancellationToken);
    }
}

Then, add this BackgroundService at Program.cs:

builder.Services.AddHostedService<ConsumeService>();

RabbitSubscriber DependencyInjection

After adding RabbitConsumer and inheriting RabbitSubscriber, you should register the BackgroundService by AddRabbitSubscriber:

var builder = Host.CreateApplicationBuilder(args);

builder.Services.AddRabbitSubscriber<ConsumeService>("FooSecondQueueConsumer");

Inject By Reading appsettings.json

Since 0.1.3, inject RabbitProducer, RabbitConsumer by reading configurations from appsettings.json is available.

To use this function, you should configre the NanoRabbit Settings in appsettings.json, here is an exmaple:

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug",
            "System": "Information",
            "Microsoft": "Information"
        }
    },
    "NanoRabbit":{
        "Producers":[
            {
                "ProducerName": "FooFirstQueueProducer",
                "HostName": "localhost",
                "Port": 5672,
                "UserName": "admin",
                "Password": "admin",
                "VirtualHost": "FooHost",
                "ExchangeName": "amq.topic",
                "RoutingKey": "FooFirstKey",
                "Type": "topic",
                "AutomaticRecoveryEnabled": true,
                "Durable": true,
                "AutoDelete": false,
                "Arguments": null
            },
            {
                "ProducerName": "BarFirstQueueProducer",
                "HostName": "localhost",
                "Port": 5672,
                "UserName": "admin",
                "Password": "admin",
                "VirtualHost": "BarHost",
                "ExchangeName": "amq.direct",
                "RoutingKey": "BarFirstKey",
                "Type": "direct",
                "AutomaticRecoveryEnabled": true,
                "Durable": true,
                "AutoDelete": false,
                "Arguments": null
            }
        ],
        "Consumers":[
            {
                "ConsumerName": "FooFirstQueueConsumer",
                "HostName": "localhost",
                "Port": 5672,
                "UserName": "admin",
                "Password": "admin",
                "VirtualHost": "FooHost",
                "QueueName": "FooFirstQueue",
                "AutomaticRecoveryEnabled": true
            },
            {
                "ConsumerName": "BarFirstQueueConsumer",
                "HostName": "localhost",
                "Port": 5672,
                "UserName": "admin",
                "Password": "admin",
                "VirtualHost": "BarHost",
                "QueueName": "BarFirstQueue",
                "AutomaticRecoveryEnabled": true
            }
        ]
    }
}

Then, register RabbitProducer and RabbitConsumer by calling AddRabbitProducerFromAppSettings and AddRabbitConsumerFromAppSettings.

AddRabbitProducerFromAppSettings

var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddRabbitProducerFromAppSettings(builder.Configuration);

AddRabbitConsumerFromAppSettings

var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddRabbitConsumerFromAppSettings(builder.Configuration);