ASP.NET Core 5 配置NServiceBus获取IConfiguration及迁移Startup类
问题解决方案
从NServiceBus配置流程中获取IConfiguration
- 你当前的代码没有使用
UseNServiceBus的完整重载,该方法原生支持接收HostBuilderContext上下文参数,不需要额外通过全局变量、反射等方式取配置。 - 上下文对象携带的IConfiguration实例,和Host运行全流程使用的配置实例完全同源,和后续Startup类中通过依赖注入拿到的IConfiguration没有差异。
修正后的参考实现:
private static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseNServiceBus((context, nsbConfig) => { // 直接从上下文读取RabbitMQ连接串 var rabbitMqConnStr = context.Configuration.GetConnectionString("RabbitMQ"); var endpointConfiguration = new EndpointConfiguration("nsb.medusa"); endpointConfiguration.UseTransport<RabbitMQTransport>() .ConnectionString(rabbitMqConnStr); endpointConfiguration.SendOnly(); return endpointConfiguration; }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
NServiceBus配置逻辑迁移到Startup类的可行性
- 不建议直接将EndpointConfiguration的初始化逻辑搬到Startup的
ConfigureServices/Configure方法中等价替换原有配置,核心影响如下:- 会破坏NServiceBus端点和Host的生命周期对齐机制,可能出现主机已触发停止但NServiceBus端点仍在接收处理消息、主机启动完成但NServiceBus端点未就绪的运行异常
- 会丢失扩展内置的自动集成能力:包括自动将
IMessageSession注册到全局DI容器、自动关联主机优雅停机流程触发NServiceBus端点的安全关闭、自动适配传输组件的DI依赖注入规则
- 如果需要拆分配置逻辑降低耦合,可以将EndpointConfiguration的构造过程抽成独立的公共方法,由Host构建阶段的NServiceBus配置回调统一调用,完全不影响原有扩展的集成能力。参考实现:
// 独立维护的NServiceBus配置逻辑 public static EndpointConfiguration CreateEndpoint(IConfiguration appConfig) { var endpointConfiguration = new EndpointConfiguration("nsb.medusa"); var rabbitMqConn = appConfig.GetConnectionString("RabbitMQ"); endpointConfiguration.UseTransport<RabbitMQTransport>().ConnectionString(rabbitMqConn); endpointConfiguration.SendOnly(); return endpointConfiguration; }
在UseNServiceBus的回调中传入从上下文拿到的IConfiguration,调用该方法即可完成配置,不需要侵入Startup的代码流程。
内容的提问来源于stack exchange,提问作者Martin Andersen
相关产品推荐
相关产品推荐

