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

Azure SDK for .NET 双Azure订阅的依赖注入实现方法

多Azure订阅IAzure实例注册及解析方案

.NET 8及以上版本方案(原生键控服务)

.NET 8开始内置支持键控服务,可以直接为不同订阅的IAzure实例绑定唯一标识完成注册,使用时按标识解析即可。

服务注册代码

// 注册订阅1的IAzure实例,自定义键为对应订阅标识
services.AddKeyedSingleton<IAzure>("Subscription1", (sp, key) => 
    Microsoft.Azure.Management.Fluent.Azure.Authenticate(azureCredentials1)
        .WithSubscription(Configuration[ConfigurationConstants.AzureAuth_SubscriptionId1]));

// 注册订阅2的IAzure实例,自定义键为对应订阅标识
services.AddKeyedSingleton<IAzure>("Subscription2", (sp, key) => 
    Microsoft.Azure.Management.Fluent.Azure.Authenticate(azureCredentials2)
        .WithSubscription(Configuration[ConfigurationConstants.AzureAuth_SubscriptionId2]));

按需解析使用

在需要调用的服务类中通过[FromKeyedServices]特性指定对应键注入即可:

public class AzureOperateService
{
    private readonly IAzure _azureSub1;
    private readonly IAzure _azureSub2;

    public AzureOperateService(
        [FromKeyedServices("Subscription1")] IAzure azureSub1,
        [FromKeyedServices("Subscription2")] IAzure azureSub2)
    {
        _azureSub1 = azureSub1;
        _azureSub2 = azureSub2;
    }

    public async Task GetAllSqlServersAsync()
    {
        // 调用订阅1的SQL服务接口
        var sub1SqlServers = await _azureSub1.SqlServers.ListAsync();
        // 调用订阅2的SQL服务接口
        var sub2SqlServers = await _azureSub2.SqlServers.ListAsync();
    }
}

.NET 8以下版本兼容方案(自定义工厂模式)

低版本.NET没有原生键控服务,可通过自定义客户端工厂实现按需获取实例。

1. 定义工厂接口及实现

public interface IAzureClientFactory
{
    /// <summary>
    /// 根据订阅标识获取对应IAzure实例
    /// </summary>
    IAzure GetClient(string subscriptionKey);
}

public class AzureClientFactory : IAzureClientFactory
{
    private readonly IConfiguration _configuration;
    private readonly Dictionary<string, Lazy<IAzure>> _clientCache;

    public AzureClientFactory(IConfiguration configuration)
    {
        _configuration = configuration;
        // 用Lazy包装实现懒加载,仅首次调用时初始化实例
        _clientCache = new Dictionary<string, Lazy<IAzure>>
        {
            ["Subscription1"] = new Lazy<IAzure>(() => 
                Microsoft.Azure.Management.Fluent.Azure.Authenticate(azureCredentials1)
                    .WithSubscription(_configuration[ConfigurationConstants.AzureAuth_SubscriptionId1])),
            ["Subscription2"] = new Lazy<IAzure>(() => 
                Microsoft.Azure.Management.Fluent.Azure.Authenticate(azureCredentials2)
                    .WithSubscription(_configuration[ConfigurationConstants.AzureAuth_SubscriptionId2]))
        };
    }

    public IAzure GetClient(string subscriptionKey)
    {
        if (_clientCache.TryGetValue(subscriptionKey, out var lazyClient))
        {
            return lazyClient.Value;
        }
        throw new ArgumentOutOfRangeException(nameof(subscriptionKey), $"未找到标识为 {subscriptionKey} 的Azure客户端配置");
    }
}

2. 注册工厂到服务集合

services.AddSingleton<IAzureClientFactory, AzureClientFactory>();

3. 按需解析使用

注入工厂后调用方法获取对应实例即可:

public class AzureOperateService
{
    private readonly IAzure _azureSub1;
    private readonly IAzure _azureSub2;

    public AzureOperateService(IAzureClientFactory azureClientFactory)
    {
        _azureSub1 = azureClientFactory.GetClient("Subscription1");
        _azureSub2 = azureClientFactory.GetClient("Subscription2");
    }
}

注意事项

  • 若两个订阅使用相同的访问凭据,只需修改WithSubscription的传入参数即可,无需初始化多份凭据对象
  • 实例标识可直接使用订阅ID作为键,避免额外的映射配置
  • 工厂模式下的懒加载逻辑可减少启动时的初始化开销,无需使用的实例不会被创建

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:45:06