Я хочу добавить два или более (в зависимости от того, сколько контейнеров для хранения Azure я хочу добавить в свое приложение) в Startup.cs
my appsettings.json:
"AzureBlobStorageConfiguration": {
"Storages": {
"Storage1": {
"StorageName": "Storage1",
"ConnString": "connString",
"AzureBlobContainerName": "containerName"
},
"Storage2": {
"StorageName": "Storage2",
"ConnString": "connString",
"AzureBlobContainerName": "containerName"
},
"Storage3": {
"StorageName": "Storage3",
"ConnString": "connString",
"AzureBlobContainerName": "containerName"
}
}
< /code>
Далее в startup.cs Im добавление службы с помощью метода: < /p>
public static IServiceCollection AddAzureStorage1(this IServiceCollection services, IConfiguration configuration)
{
var options = new ABlobStorageConfigurationOptionsDTO();
configuration.GetSection("AzureBlobStorageConfiguration").GetSection("Storages").GetSection("Storage1").Bind(options);
services.AddTransient(isp =>
{
var client = new BlobServiceClient(options.ConnString);
var container = client.GetBlobContainerClient(options.AzureBlobContainerName);
var containerName = options.AzureBlobContainerName;
var storageName = options.StorageName;
return new AzureBlobStorage1(container, containerName, storageName);
});
return services;
}
< /code>
my iazureblobstorage1 выглядит как: < /p>
public interface IAzureBlobStorage1
{
string AzureBlobContainerName { get; }
string StorageName { get; }
public Task DownloadStreamAsyns(string fileName);
public Task Upload(string fileId, Stream stream);
}
< /code>
и azureblobstorage1: < /p>
public class AzureBlobStorage1 : IAzureBlobStorage1
{
private BlobContainerClient _client;
private string _containerName;
private string _storageName;
public string StorageName => _storageName;
public string AzureBlobContainerName => _containerName;
public AzureBlobStorage1(BlobContainerClient client, string containerName, string storageName)
{
_client = client;
_containerName = containerName;
_storageName = storageName;
}
public async Task DownloadStreamAsyns(string fileName)
{
return await _client.GetBlobClient(fileName).OpenReadAsync();
}
public async Task Upload(string fileId, Stream stream)
{
await _client.GetBlobClient(fileId).UploadAsync(stream);
}
}
< /code>
После этого я могу внедрить интерфейс в классе контроллера конструктора: < /p>
public Controller(IAzureBlobStorage1 azureStorage)
{
_azureStorage1 = azureStorage;
}
< /code>
Но если я хочу добавить множество фрагментов (у меня 3 в appsetings.json), я должен: < /p>
Создать интерфейс iazureblobstorage2 (выглядит так же, как iazureblobstrage1 - только изменение имени) < /p>
< /li> AzureBlobStorage2 (выглядя так же, как AzureBlobStorage1 - только изменение имени) < /p>
< /li>
Метод копирования вставки с измененными именами классов < /p>
< /li>
< /ol>
public static IServiceCollection AddAzureStorage2(this IServiceCollection services, IConfiguration configuration)
{
var options = new ABlobStorageConfigurationOptionsDTO();
configuration.GetSection("AzureBlobStorageConfiguration")
.GetSection("Storages").GetSection("Storage2").Bind(options);
services.AddTransient(isp =>
{
var client = new BlobServiceClient(options.ConnString);
var container = client.GetBlobContainerClient(options.AzureBlobContainerName);
var containerName = options.AzureBlobContainerName;
var storageName = options.StorageName;
return new AzureBlobStorage2(container, containerName, storageName);
});
return services;
}
< /code>
Теперь я могу получить его в контроллере по < /p>
public Controller(IAzureBlobStorage2 azureStorage)
{
_azureStorage2 = azureStorage;
}
Если я хочу добавить свое третье хранилище, мне нужно скопировать вставку в третий раз мой код.>
Я хочу добавить два или более (в зависимости от того, сколько контейнеров для хранения Azure я хочу добавить в свое приложение) в Startup.cs my appsettings.json: [code]"AzureBlobStorageConfiguration": { "Storages": { "Storage1": { "StorageName": "Storage1", "ConnString": "connString", "AzureBlobContainerName": "containerName" }, "Storage2": { "StorageName": "Storage2", "ConnString": "connString", "AzureBlobContainerName": "containerName" }, "Storage3": { "StorageName": "Storage3", "ConnString": "connString", "AzureBlobContainerName": "containerName" } } < /code> Далее в startup.cs Im добавление службы с помощью метода: < /p> public static IServiceCollection AddAzureStorage1(this IServiceCollection services, IConfiguration configuration) { var options = new ABlobStorageConfigurationOptionsDTO(); configuration.GetSection("AzureBlobStorageConfiguration").GetSection("Storages").GetSection("Storage1").Bind(options);
services.AddTransient(isp => { var client = new BlobServiceClient(options.ConnString); var container = client.GetBlobContainerClient(options.AzureBlobContainerName); var containerName = options.AzureBlobContainerName; var storageName = options.StorageName;
return new AzureBlobStorage1(container, containerName, storageName); });
public async Task DownloadStreamAsyns(string fileName) { return await _client.GetBlobClient(fileName).OpenReadAsync(); }
public async Task Upload(string fileId, Stream stream) { await _client.GetBlobClient(fileId).UploadAsync(stream); } } < /code> После этого я могу внедрить интерфейс в классе контроллера конструктора: < /p> public Controller(IAzureBlobStorage1 azureStorage) { _azureStorage1 = azureStorage; } < /code> Но если я хочу добавить множество фрагментов (у меня 3 в appsetings.json), я должен: < /p>
Создать интерфейс iazureblobstorage2 (выглядит так же, как iazureblobstrage1 - только изменение имени) < /p> < /li> AzureBlobStorage2 (выглядя так же, как AzureBlobStorage1 - только изменение имени) < /p> < /li> Метод копирования вставки с измененными именами классов < /p> < /li> < /ol> public static IServiceCollection AddAzureStorage2(this IServiceCollection services, IConfiguration configuration) { var options = new ABlobStorageConfigurationOptionsDTO();
services.AddTransient(isp => { var client = new BlobServiceClient(options.ConnString); var container = client.GetBlobContainerClient(options.AzureBlobContainerName); var containerName = options.AzureBlobContainerName; var storageName = options.StorageName;
return new AzureBlobStorage2(container, containerName, storageName); });
return services; } < /code> Теперь я могу получить его в контроллере по < /p> public Controller(IAzureBlobStorage2 azureStorage) { _azureStorage2 = azureStorage; } [/code] Если я хочу добавить свое третье хранилище, мне нужно скопировать вставку в третий раз мой код.>