簡體   English   中英

使用設置注入 class 的多個實例

[英]Injecting multiple instances of a class with settings

我在使用 Azure 存儲時遇到了一些麻煩。 我目前有一個很好的實現,但我想擴展它,以便能夠在一個解決方案中使用多個存儲帳戶/容器。 我無法理解如何做到這一點,但仍然允許依賴注入。 我還需要能夠傳入定義連接字符串和容器名稱的設置

這就是我目前的做法:

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

builder.Services.Configure<AzureStorageSettings>(configuration.GetSection("AzureStorageSettings"));

然后在構造函數中

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

    _blobClient = cloudStorageAccount.CreateCloudBlobClient();
    _blobContainer = GetBlobContainer(azureStorageSettings.ContainerName);
}

我已經閱讀了很多類似的帖子,其中提到了使用命名注冊,但我使用的是內置的 IoC 容器,它不允許這樣做。 我還看到帖子說要使用看起來不錯的工廠,但我希望 package 這個邏輯並在不同的解決方案之間共享,工廠解決方案需要大量配置,我想避免這些配置使 package 易於消耗。

更新:我將設置設置為一個接口,以便在每次需要時強制實現它,我使用通用 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);
}

然后可以這樣注入:

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; }
        }
    }
}

上傳到存儲.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);
        }
    }
}

Program.cs(主要方法類)

using System;

namespace UseDifferentSettings
{
    class Program
    {
        static void Main(string[] args)
        {
            Settings setting1 = new Setting1();
            Settings setting2 = new Setting2();
            UploadToStorage uploadtostorage = new UploadToStorage(setting1);
            uploadtostorage.GoUpload();
            Console.WriteLine("Hello World!");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM