You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET Framework 4.8中将Azure ServiceBusClient注册为单例

.NET Framework 4.8 下 Azure ServiceBusClient 单例注册实现

ServiceBusClient 本身是线程安全的,官方明确推荐单例复用,重复实例化会引发AMQP连接泄漏、连接数超限、发送延迟升高等问题,以下是两种最常用的实现方式,适配.NET Framework 4.8的常见项目结构:


方式1:无依赖注入框架时的静态单例实现

适合未接入DI容器的传统.NET Framework项目,用Lazy实现线程安全的延迟加载,同时绑定进程退出事件做资源释放:

using Azure.Messaging.ServiceBus;
using System.Configuration;

public static class ServiceBusClientProvider
{
    // 线程安全的延迟初始化配置
    private static readonly Lazy<ServiceBusClient> _client = new Lazy<ServiceBusClient>(() =>
    {
        // 连接字符串存在Web.config/App.config的ConnectionStrings节点,不要硬编码
        var connStr = ConfigurationManager.ConnectionStrings["AzureServiceBus"].ConnectionString;
        var options = new ServiceBusClientOptions
        {
            TransportType = ServiceBusTransportType.AmqpTcp,
            RetryOptions =
            {
                MaxRetries = 3,
                Delay = TimeSpan.FromSeconds(1)
            }
        };
        return new ServiceBusClient(connStr, options);
    }, LazyThreadSafetyMode.ExecutionAndPublication);

    public static ServiceBusClient Client => _client.Value;

    // 进程退出时主动释放客户端资源
    static ServiceBusClientProvider()
    {
        AppDomain.CurrentDomain.ProcessExit += (_, _) =>
        {
            if (_client.IsValueCreated) _client.Value.Dispose();
        };
    }
}

调用时直接取ServiceBusClientProvider.Client即可,全局复用同一个实例。


方式2:在DI容器中注册单例

.NET Framework 4.8 项目最常用的Unity容器注册示例(Autofac等其他容器逻辑一致,仅生命周期配置写法不同),一般在项目的DI配置类(如UnityConfig.cs)中添加注册逻辑:

using Azure.Messaging.ServiceBus;
using Unity;
using System.Configuration;

public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();
        
        // 注册ServiceBusClient单例,容器全局复用一个实例
        container.RegisterFactory<ServiceBusClient>(_ =>
        {
            var connStr = ConfigurationManager.ConnectionStrings["AzureServiceBus"].ConnectionString;
            return new ServiceBusClient(connStr);
        }, new ContainerControlledLifetimeManager());

        // 其余服务注册逻辑...
        
        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}

注册完成后就可以在控制器、服务类中通过构造函数注入ServiceBusClient实例,容器会自动维护单例生命周期。


注意事项

  • 不要将ServiceBusSender、ServiceBusReceiver注册为全局单例,这两个对象轻量无状态,按需通过ServiceBusClient的CreateSender/CreateReceiver方法创建即可
  • 不要在业务代码中手动Dispose单例的ServiceBusClient,否则后续所有调用都会抛出对象已释放异常
  • 单例初始化时的ClientOptions可以根据业务场景调整重试、传输模式配置,不要使用默认无配置的初始化逻辑用于生产环境

内容的提问来源于stack exchange,提问作者Aryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 16:54:42