Мне интересно узнать, как правильно реализовать шаблон публикации / подписки 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)?