Внедрение зависимостей от создания экземпляров закрытого класса - PullRequest
0 голосов
/ 23 ноября 2018

В настоящее время я пытаюсь создать запечатанный класс, который получает конфигурацию хранилища Azure через настройки, хранящиеся в JSON.Я регистрирую настройки в классе startup.cs, а затем внедряю их в конструктор.Проблема в том, когда мне нужно инициировать тот же класс в классе, потому что это запечатанный класс

public sealed class AzureFileStorage
{
    private static volatile AzureFileStorage instance;
    private static object syncRoot = new Object();
    private readonly AzureBlobSettings _azureBlobSettings;

    public CloudStorageAccount StorageAccount { get; private set; }
    public CloudBlobClient BlobClient { get; private set; }
    public CloudBlobContainer Container { get; private set; }

    public AzureFileStorage(IOptions<AzureBlobSettings> fbAuthSettingsAccessor)
    {
        _azureBlobSettings = fbAuthSettingsAccessor.Value;
        StorageAccount = CloudStorageAccount.Parse(_azureBlobSettings.BlobStorageConnectionString);

        //instantiate the client
        BlobClient = StorageAccount.CreateCloudBlobClient();

        //set the container
        Container = BlobClient.GetContainerReference(_azureBlobSettings.ContainerBlobAzureId);

    }

    public static AzureFileStorage Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {

                    if (instance == null)
                        instance = new AzureFileStorage(????);
                }
            }

            return instance;
        }
    }
}

Как мне инициализировать azurefilestorage, если azureblobsettings передаются через внедрение зависимостей.

1 Ответ

0 голосов
/ 24 ноября 2018

Как уже упоминалось комментатором, текущий дизайн не подходит для внедрения зависимостей.

Класс AzureFileStorage должен быть подвергнут рефакторингу для удаления экземпляра singleton и, кроме того, иметь собственную абстракцию.

public interface IAzureFileStorage {
    CloudStorageAccount StorageAccount { get; }
    CloudBlobClient BlobClient { get; }
    CloudBlobContainer Container { get; }
}

public sealed class AzureFileStorage : IAzureFileStorage {
    private readonly AzureBlobSettings _azureBlobSettings;


    public AzureFileStorage(IOptions<AzureBlobSettings> fbAuthSettingsAccessor) {
        _azureBlobSettings = fbAuthSettingsAccessor.Value;
        StorageAccount = CloudStorageAccount.Parse(_azureBlobSettings.BlobStorageConnectionString);

        //instantiate the client
        BlobClient = StorageAccount.CreateCloudBlobClient();

        //set the container
        Container = BlobClient.GetContainerReference(_azureBlobSettings.ContainerBlobAzureId);
    }

    public CloudStorageAccount StorageAccount { get; private set; }
    public CloudBlobClient BlobClient { get; private set; }
    public CloudBlobContainer Container { get; private set; }
}

И зарегистрирован как синглтон с набором сервисов

public void ConfigureServices(IServiceCollection services) {

    //...

    service.AddSingleton<IAzureFileStorage, AzureFileStorage>();

    //...
}

Так что, где когда-либо IAzureFileStorage явно вводится,

private readonly IAzureFileStorage fileStore;

public SomeClass(IAzureFileStorage fileStore) {
    this.fileStore = fileStore;
}

тот же экземпляр будетиспользовать через приложение.

...