C# 使用设置注入类的多个实例

C# 使用设置注入类的多个实例,c#,dependency-injection,azure-storage,C#,Dependency Injection,Azure Storage,我在使用Azure存储时遇到了一些问题。目前我有一个实现,它很好,但我想扩展它,以便能够在一个解决方案中使用多个存储帐户/容器。我不知道如何做到这一点,但仍然允许依赖注入。我还需要能够传入定义连接字符串和容器名称的设置 我现在就是这样做的: builder.Services.AddSingleton<IAzureStorageClient, AzureStorageClient>(); builder.Services.Configure<AzureStorageSettin

我在使用Azure存储时遇到了一些问题。目前我有一个实现,它很好,但我想扩展它,以便能够在一个解决方案中使用多个存储帐户/容器。我不知道如何做到这一点,但仍然允许依赖注入。我还需要能够传入定义连接字符串和容器名称的设置

我现在就是这样做的:

builder.Services.AddSingleton<IAzureStorageClient, AzureStorageClient>();

builder.Services.Configure<AzureStorageSettings>(configuration.GetSection("AzureStorageSettings"));
builder.Services.AddSingleton();
builder.Services.Configure(configuration.GetSection(“AzureStorageSettings”);
然后在构造函数中

public AzureStorageClient(IOptions<AzureStorageSettings> options)
{
    var azureStorageSettings = options.Value;
    var cloudStorageAccount = GetCloudStorageAccount(azureStorageSettings.ConnectionString);

    _blobClient = cloudStorageAccount.CreateCloudBlobClient();
    _blobContainer = GetBlobContainer(azureStorageSettings.ContainerName);
}
public AzureStorageClient(IOptions选项)
{
var azureStorageSettings=options.Value;
var cloudStorageAccount=GetCloudStorageAccount(azureStorageSettings.ConnectionString);
_blobClient=cloudStorageAccount.CreateCloudBlobClient();
_blobContainer=GetBlobContainer(azureStorageSettings.ContainerName);
}
我读过很多类似的帖子,提到使用命名注册,但我使用的是内置的IoC容器,它不允许这样做。我也看到一些帖子说使用一个看起来不错的工厂,但我希望将这个逻辑打包,并在不同的解决方案中共享,工厂解决方案需要大量配置,我希望避免这些配置,以使包易于使用

更新: 我将设置设置为一个接口,以便在每次需要时强制实现它,并使用通用T将其传递到我的存储客户端,如下所示:

public sealed class AzureStorageClient<T> : IAzureStorageClient<T> where T : class, IAzureStorageSettings, new()

public AzureStorageClient(IOptions<T> options) 
{
    var azureStorageSettings = options.Value;
    var cloudStorageAccount = GetCloudStorageAccount(azureStorageSettings.ConnectionString);

    _blobClient = cloudStorageAccount.CreateCloudBlobClient();
    _blobContainer = GetBlobContainer(azureStorageSettings.ContainerName);
}
公共密封类AzureStorageClient:IAzureStorageClient其中T:class,IAzureStorageSettings,new()
public AzureStorageClient(IOptions选项)
{
var azureStorageSettings=options.Value;
var cloudStorageAccount=GetCloudStorageAccount(azureStorageSettings.ConnectionString);
_blobClient=cloudStorageAccount.CreateCloudBlobClient();
_blobContainer=GetBlobContainer(azureStorageSettings.ContainerName);
}
然后可以像这样注射:

builder.Services.AddSingleton<IAzureStorageClient<SpecificStorageSettings>, AzureStorageClient<SpecificStorageSettings>>();
builder.Services.AddSingleton();

举个例子,您可以使用如下设置:

builder.Services.AddSingleton<IAzureStorageClient<SpecificStorageSettings>, AzureStorageClient<SpecificStorageSettings>>();
设置.cs

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace UseDifferentSettings
    {
        public abstract class Settings
        {
            public abstract string connectingstring {
                get;
            }
            public abstract string containername {
                get;
            }
            public abstract string blobname {
                get;
            }
        }
    }
设置1.cs

 using System;
    using System.Collections.Generic;
    using System.Text;

    namespace UseDifferentSettings
    {
        class Setting1 : Settings
        {
            string _connectingstring = "DefaultEndpointsProtocol=https;AccountName=xxx;EndpointSuffix=core.windows.net";
            string _containername = "video1";
            string _blobname = "test.txt";
            public override string connectingstring
            {
                get { return _connectingstring; }
            }
            public override string containername
            {
                get { return _containername; }
            }
            public override string blobname
            {
                get { return _blobname; }
            }
        }
    }
设置2.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace UseDifferentSettings
{
    class Setting2 : Settings
    {
        private string _connectingstring = "DefaultEndpointsProtocol=https;AccountName=xxx;EndpointSuffix=core.windows.net";
        private string _containername = "test";
        private string _blobname = "test.txt";
        public override string connectingstring
        {
            get { return _connectingstring; }
        }
        public override string containername
        {
            get { return _containername; }
        }
        public override string blobname
        {
            get { return _blobname; }
        }
    }
}
UploadToStorage.cs

using Azure.Storage.Blobs;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace UseDifferentSettings
{
    public class UploadToStorage
    {
        Settings setting;
        public UploadToStorage(Settings setting) {
            this.setting = setting;
        }
        public void GoUpload() {
            string connectingstring = setting.connectingstring;
            string containername = setting.containername;
            string blobname = setting.blobname;
            string filecontent = "This is my test file content";
            byte[] array = Encoding.ASCII.GetBytes(filecontent);
            MemoryStream filestream = new MemoryStream(array);
            BlobServiceClient blobServiceClient = new BlobServiceClient(connectingstring);
            BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containername);
            BlobClient blobClient = containerClient.GetBlobClient(blobname);
            blobClient.Upload(filestream);
        }
    }
}
cs(主方法类)


创建具有不同名称的设置类,并从不同部分进行配置。您好,有更新吗?我的答案是你想要的答案吗?谢谢你的帮助,很抱歉耽搁了,你的帖子帮了我很大的忙,但是我做了一个小小的改动,如果你感兴趣的话,你可以在我原来的问题的更新中看到。谢谢again@Sukhy我很高兴我的回答能帮助你。:)