Внедрение зависимостей от экземпляров классов закрытых классов

В настоящее время я пытаюсь создать запечатанный класс, который получает конфигурацию хранилища 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;
        }
    }
}

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

1 ответ

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

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

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

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

Другие вопросы по тегам