首页 > 解决方案 > Azure SDK for .Net - 两个订阅的依赖注入

问题描述

我有以下代码将实例注册到 Azure 服务的 .net 服务集合。

services.AddSingleton(x => Microsoft.Azure.Management.Fluent.Azure.Authenticate(azureCredentials)
             .WithSubscription(Configuration[ConfigurationConstants.AzureAuth_SubscriptionId]));

然后,此代码解析我的服务类中的一个实例,IAzure我可以在其中访问所有可用的服务,例如_azure.SqlServers.ListAsync等。

我想要一种方法,以便我可以使用两个 Azure 订阅,从而将两个实例注册到服务集合,然后能够解决我想要的一个。您可以在此处查看我想要的类似示例,不过它是关于 blob 存储的。

标签: .net-coredependency-injectionazure-sdk-.net

解决方案


与链接的示例一样,您需要一种方法来唯一区分服务,并且很可能需要使用工厂模式设计

public interface IAzureFactory {
    IAzure GetSubscription(string subscriptionId);
}

订阅 ID 可用于分隔服务,但这需要从服务中获取当前订阅 ID 才能找到匹配项

public class AzureFactory : IAzureFactory {
    private readonly IEnumerable<IAzure> subs;

    public AzureFactory (IEnumerable<IAzure> subs) {
        this.subs = subs;
    }

    public IAzure GetSubscription(string subscriptionId) {
        return subs.FirstOrDefault(_ => _.SubscriptionId == subscriptionId) ??
            throw new InvalidArgumentException("invalid subscription Id)"; 
    }
}

从那里只需注册不同的订阅即可。

services.AddSingleton<IAzureFactory, AzureFactory>();

services
    .AddSingleton(x => Microsoft.Azure.Management.Fluent.Azure.Authenticate(azureCredentials)
         .WithSubscription(Configuration[ConfigurationConstants.AzureAuth_SubscriptionId1]));

services
    .AddSingleton(x => Microsoft.Azure.Management.Fluent.Azure.Authenticate(azureCredentials)
         .WithSubscription(Configuration[ConfigurationConstants.AzureAuth_SubscriptionId2]));

并使用工厂获得所需的订阅

//...

private readonly IAzure azure;

//ctor
public MyService(IAzureFactory factory) {
    azure = factory.GetSubscription(...);
}

//...

推荐阅读