Инъекция зависимости: несколько интерфейсов для одного и того же хранилища (с различными строками соединения)C#

Место общения программистов C#
Ответить
Anonymous
 Инъекция зависимости: несколько интерфейсов для одного и того же хранилища (с различными строками соединения)

Сообщение Anonymous »

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

Подробнее здесь: https://stackoverflow.com/questions/684 ... ifferent-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»