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

C# 什么';在ASP.NET Core 2.x中实现EasyNetQ发布/订阅模式的正确方法是什么?,c#,asp.net-core,easynetq,C#,Asp.net Core,Easynetq,我很好奇在ASP.NET Core 2.x应用程序中实现EasyNetQ发布/订阅模式的正确方法。具体来说,我需要确保所有这些资源上的生命周期都是正确的,并且订阅线程都是正确拥有/活动的 我知道IBus应该是单身人士 标准做法是在应用程序的生命周期内创建一个IBus实例。在应用程序关闭时处理它 因此,看起来是这样的(尽管,我应该使用各种appsettings文件来提供特定于环境的连接字符串……假设就这个问题而言,这是可以的) Startup.cs public void配置服务(IServic

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

我知道
IBus
应该是单身人士

标准做法是在应用程序的生命周期内创建一个IBus实例。在应用程序关闭时处理它

因此,看起来是这样的(尽管,我应该使用各种appsettings文件来提供特定于环境的连接字符串……假设就这个问题而言,这是可以的)

Startup.cs

public void配置服务(IServiceCollection服务)
{
services.AddSingleton(RabbitHutch.CreateBus(“host=localhost”);
}
现在,我喜欢这个特性,但不清楚何时何地运行各种subscribe方法

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

在启动环境中直接运行它似乎是不对的,对吗

  • 订阅线程是否由正确的父线程“拥有”(是否存在这种情况)
  • AutoSubscriber
    的预期/正确生命周期是什么,
    Singleton
    是否有必要
  • 我真的想注册自动订户吗?我不希望任何其他代码需要它,我只需要方便/正确地访问
    Configure
    (似乎是运行
    subscribebeasync
    之类的方法的合适位置)
Startup.cs

public void配置服务(IServiceCollection服务)
{
services.AddSingleton(RabbitHutch.CreateBus(“host=localhost”);

相反,services.AddSingleton(我应该实现启动/停止方法还是
BackgroundService
OK)?

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

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

这只是一个基于使用NodeJ使用RabbitMQ的经验的假设。强烈建议在使用RabbitMQ时,您只有一个连接,始终保持连接。如果您的代码连接、发布,然后断开连接,您对自己和使用RabbitMQ服务器的人都不利。因此,我不会感到惊讶您需要一个单例,因为它总是返回相同的实例aka。只需使用一个连接。您的
CreateBus
可能需要比
host=localhost
更多的参数,例如
port
username
password
vhost
。我希望这对您有所帮助。对不起,您失去了我。发生了什么事恩?@acarlstein我不关心IBU的生命周期。我已经讨论过了。EasyNetQ处理主要工作线程。我不打开/关闭任何东西。我关心的是ASP.NET核心框架和EasyNetQ公开的消费模式的交叉点。