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
相关产品推荐
相关产品推荐

