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

Azure应用中为两个存储账户配置依赖注入的问题

如何在.NET中通过DI注入并区分多个Azure存储账户?

问题场景

我有一个应用,需要引用两个不同的存储账户(SA1和SA2),它们分别拥有一个容器“container1”和“container2”。我进行了如下依赖注入配置(不确定是否正确):

serviceCollection.AddAzureClients(builder =>
{
    builder.AddBlobServiceClient("SA1_connectionStr")
        .WithVersion(BlobClientOptions.ServiceVersion.V2019_02_02);

    builder.AddBlobServiceClient("SA2_connectionStr")
        .WithVersion(BlobClientOptions.ServiceVersion.V2019_02_02);
});

当我使用以下代码获取“blobContainer”引用时,它仅指向SA2存储账户中的容器(可能是因为SA2是最后添加到DI配置中的):

private readonly BlobServiceClient blobServiceClient;
var blobContainer = blobServiceClient.GetBlobContainerClient(container2);

请问如何分别引用存储账户SA1和SA2?


解决方案

方法一:使用命名客户端(推荐)

当需要注册多个同类型的Azure客户端时,通过WithName方法为每个客户端分配唯一名称,后续通过客户端工厂获取指定名称的实例。

  1. 注册命名的BlobServiceClient
serviceCollection.AddAzureClients(builder =>
{
    builder.AddBlobServiceClient("SA1_connectionStr")
        .WithVersion(BlobClientOptions.ServiceVersion.V2019_02_02)
        .WithName("SA1"); // 为SA1存储账户的客户端指定名称

    builder.AddBlobServiceClient("SA2_connectionStr")
        .WithVersion(BlobClientOptions.ServiceVersion.V2019_02_02)
        .WithName("SA2"); // 为SA2存储账户的客户端指定名称
});
  1. 通过IAzureClientFactory<BlobServiceClient>获取指定客户端
private readonly BlobServiceClient _sa1BlobClient;
private readonly BlobServiceClient _sa2BlobClient;

// 构造函数注入客户端工厂
public YourService(IAzureClientFactory<BlobServiceClient> clientFactory)
{
    _sa1BlobClient = clientFactory.CreateClient("SA1");
    _sa2BlobClient = clientFactory.CreateClient("SA2");
}

// 使用示例
public void AccessContainers()
{
    var container1 = _sa1BlobClient.GetBlobContainerClient("container1");
    var container2 = _sa2BlobClient.GetBlobContainerClient("container2");
    
    // 执行容器相关操作,比如上传/下载Blob等
}

方法二:直接注入目标容器客户端

如果你的应用仅需要访问特定容器,可直接注册对应的BlobContainerClient,跳过后续手动获取容器的步骤:

  1. 注册命名的BlobContainerClient
serviceCollection.AddAzureClients(builder =>
{
    // 注册SA1的container1容器客户端
    builder.AddBlobContainerClient("SA1_connectionStr", "container1")
        .WithVersion(BlobClientOptions.ServiceVersion.V2019_02_02)
        .WithName("SA1_Container1");

    // 注册SA2的container2容器客户端
    builder.AddBlobContainerClient("SA2_connectionStr", "container2")
        .WithVersion(BlobClientOptions.ServiceVersion.V2019_02_02)
        .WithName("SA2_Container2");
});
  1. 直接注入使用
private readonly BlobContainerClient _container1;
private readonly BlobContainerClient _container2;

public YourService(IAzureClientFactory<BlobContainerClient> clientFactory)
{
    _container1 = clientFactory.CreateClient("SA1_Container1");
    _container2 = clientFactory.CreateClient("SA2_Container2");
}

// 直接使用容器客户端操作Blob
public async Task UploadBlobToContainer1(string blobName, Stream content)
{
    await _container1.UploadBlobAsync(blobName, content);
}

内容的提问来源于stack exchange,提问作者O'Neil Tomlinson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:22:04