доступ к облачному хранилищу Azure с новой конфигурацией в ASP.NET Core 2.0

Есть ли способ настроить облачное хранилище Azure в ConfigureServices класса Startup так же, как я настраиваю свой DatabaseContext?

var connection = Configuration.GetConnectionString("myDatabaseConnectionString");
services.AddDbContext<DatabaseContext>
         (options => options.UseSqlServer(connection));

Я знаю, что могу получить доступ к строке подключения из контроллера, добавив экземпляр IConfiguration в набор служб в качестве одноэлементного объекта в ConfigureServices, а затем внедрив IConfiguration в контроллер.

Но как мне получить доступ к этому в следующем классе или это плохая практика, и есть лучший способ (например, в services.Add...)?

public class ClassifiedsToProcess
{
    public static void AddMessage(string message)
    {
         var storageConnectionString = Configuration.Get("AppSettings:ConnectionString");
         storageAccount = CloudStorageAccount.Parse(storageConnectionString);
         ...
    }
}

Спасибо !


person AlexandreG    schedule 25.09.2018    source источник


Ответы (2)


Вот как я решил свою проблему, используя IOptions, предложенную Мартином Брандлом.

Код контроллера

private string makeJson;
private MyAzureQueue MyAzureQueue;


public AdminController(IOptions<AzureOptions> optionsAccessor)
{
   MyAzureQueue = new MyAzureQueue(optionsAccessor);
}


public IActionResult Index()
{ 
   MyAzureQueue.AddMessage("my message");
   return View();
}

Класс MyAzureQueue

public interface IMessageRepository
{
    void AddMessage(string message);
}

public class MyAzureQueue: IMessageRepository
{
    private readonly CloudQueue _queue;
    public ClassifiedsToProcess(IOptions<AzureOptions> optionsAccessor)
    {
        CloudStorageAccount storageAccount = AzureStorageHelper.getStorageAccount(optionsAccessor.Value.StorageConnectionString);
        _queue = AzureStorageHelper.GetQueue(storageAccount, "mystorageaccount");
    }

    public void AddMessage(string message)
    {
        CloudQueueMessage cloudQueueMessage = new CloudQueueMessage(message);
        _queue.AddMessageAsync(cloudQueueMessage);
    }
}

Класс параметров Azure

public class AzureOptions
{
    public AzureOptions()
    {
    }

    public string StorageConnectionString { get; set; }
}

В методе Startup.cs ConfigureServices я добавил следующие две строки

services.AddOptions();
services.Configure<AzureOptions>(Configuration.GetSection("Azure"));

А вот как выглядит мой файл appsettings.json

{
"Azure": {
 "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=mystorageaccount;AccountKey=XXXXXXXXXXXXXXXXXXXXX;EndpointSuffix=core.windows.net"
 }
}
person AlexandreG    schedule 09.10.2018

Вам следует попытаться не использовать IConfiguration напрямую и использовать шаблон Option в ASP.NET Core.

В вашем примере я бы e. грамм. реализовать IMessageRepository, который использует учетную запись хранения для сохранения сообщений.

Ваш класс ClassifiedsToProcess будет иметь зависимость конструктора от него, и ваш метод AddMessage будет использовать его (он не должен быть статическим, поскольку вы хотите получить доступ к репозиторию).

person Martin Brandl    schedule 25.09.2018
comment
Спасибо за быстрый ответ ! Действительно, IMessageRepository кажется довольно хорошим. К сожалению, документация по шаблону option меня немного сбивает с толку, можете ли вы дать мне более конкретный ответ в моем примере? Я также попытался реализовать IMessageRepository на основе вашего руководства, но все еще не могу получить доступ к части конфигурации. Есть идеи? Вы можете найти то, что я сделал здесь pastebin.com/iSekPnN5 - person AlexandreG; 25.09.2018