Как правильно внедрить шаблон публикации / подписки EasyNetQ в ASP.NET Core 2.x? - PullRequest
1 голос
/ 13 мая 2019

Мне интересно узнать, как правильно реализовать шаблон публикации / подписки EasyNetQ в приложении ASP.NET Core 2.x. В частности, мне нужно убедиться, что жизненный цикл всех этих ресурсов правильный и что потоки подписки принадлежат / живут правильно.

Я понимаю, что IBus должен быть синглтоном.

Стандартная практика заключается в создании одного экземпляра IBus на весь срок службы вашего приложения. Утилизируйте его, когда ваше приложение закрывается.

https://github.com/EasyNetQ/EasyNetQ/wiki/Connecting-to-RabbitMQ

Итак, это выглядит так (хотя я должен использовать различные файлы appsettings для предоставления специфичных для среды строк подключения ... давайте предположим, что это нормально для целей этого вопроса).

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IBus>(RabbitHutch.CreateBus("host=localhost"));
}

Теперь мне нравится функция Auto Subscriber , но неясно, когда / где запускать различные методы подписки.

Вы можете использовать его, чтобы легко сканировать определенную сборку для классов, которые реализуют любой из интерфейсов IConsume или IConsumeAsync, а затем позволить авто подписчику подписывать этих потребителей на вашу шину.

Неправильно запускать эти напрямую в контексте запуска, верно?

  • Принадлежат ли потоки подписки правильному родительскому потоку (есть ли такая вещь)?
  • Какой ожидаемый / правильный жизненный цикл для AutoSubscriber, является ли Singleton даже необходимым?
  • Действительно ли я вообще хочу зарегистрироваться AutoSubscriber? Я не хочу, чтобы какой-либо другой код требовал его, мне просто нужно, чтобы он был легко / правильно доступен для Configure (кажется, подходящее место для запуска метода, подобного SubscribeAsync).

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IBus>(RabbitHutch.CreateBus("host=localhost"));
    services.AddSingleton<AutoSubscriber>(provider => new AutoSubscriber(provider.GetRequiredService<IBus>(), Assembly.GetExecutingAssembly().GetName().Name));
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.ApplicationServices.GetRequiredService<AutoSubscriber>().SubscribeAsync(Assembly.GetExecutingAssembly());
}

Должен ли я вместо этого использовать Hosted Service (я должен реализовать методы запуска / остановки или BackgroundService OK)?

...