繁体   English   中英

在 ASP.NET Core 2.x 中实现 EasyNetQ 发布/订阅模式的正确方法是什么?

[英]What's the correct way to implement the EasyNetQ pub/sub pattern in ASP.NET Core 2.x?

我很好奇在 ASP.NET Core 2.x 应用程序中实现 EasyNetQ 发布/订阅模式的正确方法。 具体来说,我需要确保所有这些资源的生命周期都是正确的,并且订阅线程被正确拥有/存活。

我知道IBus应该是一个单身人士。

标准做法是为应用程序的生命周期创建单个 IBus 实例。 当您的应用程序关闭时处理它。

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

所以,看起来像这样(虽然,我应该使用各种 appsettings 文件来提供特定于环境的连接字符串......让我们假设这对于这个问题的目的是可以的)。

启动文件

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

现在,我喜欢Auto Subscriber功能,但在何时/何地运行各种订阅方法并不明显。

您可以使用它轻松扫描特定程序集以查找实现 IConsume 或 IConsumeAsync 接口的类,然后让自动订阅者将这些使用者订阅到您的总线。

直接在启动上下文中运行它似乎不正确,对吗?

  • 订阅线程是否由正确的父线程“拥有”(是否有这样的事情)?
  • AutoSubscriber的预期/正确生命周期是AutoSubscriberSingleton甚至是必要的吗?
  • 我真的想注册AutoSubscriber吗? 我不希望任何其他代码需要它,我只需要它可以轻松/正确地访问Configure (似乎是运行SubscribeAsync类的方法的正确位置)。

启动文件

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正常)?

我遇到了同样的难题。 我发现您可以将容器中注册的任何内容注入 Startup::Configure 并执行一次性启动任务,例如使用 AutoSubscriber。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IBus bus)
{
    var subscriber = new AutoSubscriber(bus, Assembly.GetExecutingAssembly().GetName().Name);
    subscriber.Subscribe(Assembly.GetExecutingAssembly());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM