在.net核心的服务集合中注册两个jsonsetting



我有两个托管服务,每个服务都使用自己的rabbit mq地址,如您所见:

{
"RabbitMQOptions": {
"HostName": "172.23.131.1",
"VirtualHost": "/",
"Port": 5672,
"Username": "**",
"Password": "***!"
},
"RabbitMQOptions1": {
"HostName": "172.23.39.1",
"VirtualHost": "***",
"Port": 5672,
"Username": "***",
"Password": "123456"
}
}

我有两个名为N4和Fund的托管服务,它们每个都需要自己的rabbitmq配置这是我的员工的代码:

public class N2Worker : BackgroundService
{
private readonly string QUEUE_CONSUMER_NAME;

private readonly IRabbitMQConsumer _rabbitMQConsumer;

public N2Worker(
IRabbitMQConsumer rabbitMQConsumer,
IConfiguration configuration)
{
_rabbitMQConsumer = rabbitMQConsumer;
}
}

所以在我的程序.cs中,我添加了这个:

IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddRabbitMQ(hostContext.Configuration);
services.AddHostedService<N2Worker>();
services.AddHostedService<FundWorker>();
})
.Build();

await host.RunAsync();

所以在AddRabbitMQ中,我有这个:

public static IServiceCollection AddRabbitMQ(
this IServiceCollection services, IConfiguration configuration)
{
services.Configure<RabbitMQOptions>(configuration.GetSection(
RabbitMQOptions.DefaultSectionName));
services.AddSingleton<RabbitMqService>();

return services;
}

我的rabbitService类是:

public sealed class RabbitMqService
{
private readonly RabbitMQOptions _configuration;
public RabbitMqService(IOptions<RabbitMQOptions> options)
{
_configuration = options.Value;
}
public IConnection CreateConnection()
{
var connection = new ConnectionFactory()
{
HostName   =  _configuration.HostName,
Port       = _configuration.Port,
VirtualHost= _configuration.VirtualHost,
UserName   =  _configuration.Username,
Password   = _configuration.Password,
DispatchConsumersAsync = true
};

return connection.CreateConnection();
}
}

正如你在AppSetting中看到的那样,我有不同的地址,我的问题是如何注册两个不同配置的RabbitMQ实例?

这是我的消费者的代码:

public sealed class RabbitMQConsumer : IRabbitMQConsumer, IDisposable
{
private IModel _channel;
private IConnection _connection;
private readonly RabbitMqService _rabbitMqService;

public RabbitMQConsumer(RabbitMqService rabbitMqService)
{
_rabbitMqService = rabbitMqService;
}
}

我想把rabbitConsumer注入到每个不同配置的工作中,我的意思是N4使用RabbitMQOptions,基金使用Rabbit MQOptions1

您的配置名称中不能有两个具有相同名称的部分,因此您必须对它们进行不同的命名,例如:

"RabbitMQOptions1": { ... },
"RabbitMQOptions2": { ... }

接下来,您必须分别注册这两个服务,同时加载它们各自的配置,例如:

var options1 = Configuration.GetSection("RabbitMQOptions1").Get<RabbitMQOptions>();
services.AddSingleton<RabbitMqService>(_ => new RabbitMqService(options1));
var options2 = Configuration.GetSection("RabbitMQOptions2").Get<RabbitMQOptions>();
services.AddSingleton<RabbitMqService>(_ => new RabbitMqService(options2));

最后,由于RabbitMqService现在依赖于RabbitMQOptions而不是IOptions<RabbitMQOptions>,因此需要更改其构造函数:

public sealed class RabbitMqService
{
private readonly RabbitMQOptions _configuration;
public RabbitMqService(RabbitMQOptions options)
{
_configuration = options;
}
...
}

最新更新