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