Время жизни в ядре .NET при каждом вызове метода - PullRequest
0 голосов
/ 10 мая 2018

У меня есть две службы, обменивающиеся данными через 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

1 Ответ

0 голосов
/ 10 мая 2018

Почему бы не обернуть метод во время вложения?

Сначала создайте обертку для метода:

public static class ScopeFactoryExtension
{
   public static EventHandler<BasicDeliverEventArgs> WrapInScope(this IServiceScopeFactory scopeFactory, Func<IMyScopedService, object, BasicDeliverEventArgs, Task> func)
   {
      async void InScope(object arg1, BasicDeliverEventArgs arg2)
      {
         using (var scope = scopeFactory.CreateScope())
         {
            await func(scope, arg1, arg2);
         }
      }

      return InScope;
   }
}

Затем оберните весь метод:

consumer.Received += scopeFactory.WrapInScope(HandleMessageReceived);

Такженеобходимо расширить метод:

private async Task HandleMessageReceived(IMyScopedService service, object model, BasicDeliverEventArgs args)
{
   //do logic with service
}
...