У меня есть две службы, обменивающиеся данными через RabbitMQ, я хочу применить срок действия для каждого полученного сообщения.
Мой потребитель:
public class Consumer
{
private IModel channel;
public Consumer(IModel channel)
{
this.channel = channel;
}
public void Consume()
{
var queue = channel.QueueDeclare(queue: MessagingConfigs.QueueName,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, args) => HandleMessageReceived(model, args);
channel.BasicConsume(queue: MessagingConfigs.QueueName, autoAck: false, consumer: consumer);
}
private async Task HandleMessageReceived(object model, BasicDeliverEventArgs args)
{
//do logic
}
}
HandleMessageReceived будет вызываться при каждом срабатывании полученного события. Как я могу открывать новую область при каждом вызове HandleMessageReceived?
Нашел решение онлайн:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IMyScopedService, MyScopedService>();
var serviceProvider = services.BuildServiceProvider();
var serviceScopeFactory = serviceProvider.GetRequiredService<IServiceScopeFactory>();
IMyScopedService scopedOne;
using (var scope = serviceScopeFactory.CreateScope())
{
scopedOne = scope.ServiceProvider.GetService<Consumer>();
Consumer.Consume();
}
}
Я думаю, что если я использую вышеупомянутое в файле startup.cs Consumer будет вызываться один раз, а область действия будет открыта один раз за время существования приложения, может сработать следующее:
private async Task HandleMessageReceived(object model, BasicDeliverEventArgs args)
{ using (var scope = serviceScopeFactory.CreateScope())
{
//do logic
}
}
но я не хочу включать пожизненную регистрацию в свой потребительский код, есть ли способ в ядре .Net автоматически открывать область при каждом вызове метода, что я могу использовать в startup.cs или программе. CS
Мое приложение - консольное приложение ядра .net, а не ASP.NET