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方法为每个客户端分配唯一名称,后续通过客户端工厂获取指定名称的实例。
- 注册命名的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存储账户的客户端指定名称 });
- 通过
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,跳过后续手动获取容器的步骤:
- 注册命名的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"); });
- 直接注入使用
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
相关产品推荐
相关产品推荐

