Добавление конфигурации в проекты .NET 6 с помощью шаблона IOptions

Добрый день, ребята!

В продолжение моего последнего поста о Dependency Injection, я хотел дополнить его актуальным руководством по добавлению конфигурации. Мы начнем с Web API (поскольку он самый простой), а затем рассмотрим добавление конфигурации в другие типы проектов, такие как консольные приложения или тесты.

Начнем с API

Если вы создадите новый проект Web API в Visual Studio, вам будет предложено несколько файлов по умолчанию, но для нас важны следующие:

  • appsettings.jsonЭто наш конфигурационный файл. Мы добавим сюда несколько новых конфигураций через секунду.

  • Program.csЭто загрузочный файл, который все устанавливает. Мы изменим его в ближайшее время, чтобы прочитать конфигурацию и передать ее нашему контроллеру.

  • WeatherForecastController.csЭто образец контроллера по умолчанию, созданный Visual Studio. Мы изменим его для чтения конфигурации.

Шаг 1: Добавить конфигурацию

Добавьте пользовательский раздел ApiSettings в ваш конфиг. Ваш файл appsettings.json должен выглядеть примерно так.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ApiSettings": {
    "ApiName": "My Awesome API"
  }
}

Войти в полноэкранный режим Выйти из полноэкранного режима

Шаг 2: Добавьте класс конфигурации с сильной типизацией

Наш пользовательский раздел назывался ApiSettings с единственным строковым полем ApiName, поэтому давайте определим класс с такой же схемой.

    public class ApiSettings
    {
        public string ApiName { get; set; }
    }

Вход в полноэкранный режим Выход из полноэкранного режима

Шаг 3: Зарегистрируйте конфиг в Program.cs

Примечание: Если вы используете .NET версии ниже .NET 6, то вместо этого будет использоваться метод ConfigureServices из Startup.cs.

        var builder = WebApplication.CreateBuilder(args);

        // Add services to the container.

        builder.Services.AddControllers();
        // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
        builder.Services.AddEndpointsApiExplorer();
        builder.Services.AddSwaggerGen();

        var app = builder.Build();

Вход в полноэкранный режим Выход из полноэкранного режима

Выше приведено автоматически сгенерированное содержимое Program.cs вашего .NET6 Web Api. Перед вызовом Build на builder, добавьте следующее:

        builder.Services.Configure<ApiSettings>(builder.Configuration.GetSection("ApiSettings"));

Войти в полноэкранный режим Выйти из полноэкранного режима

Это регистрирует наш раздел конфигурации ApiSettings, связанный с сильно типизированным классом, который мы создали ранее, в контейнере .NET Dependency Injection.

Шаг 4: Прибыль?

Теперь, когда мы проделали всю тяжелую работу, мы можем использовать соответствующий конфиг, внедрив его в контроллер или службу. В демонстрационных целях давайте внедрим его в автоматически созданный WeatherForecastController.

    public WeatherForecastController(ILogger<WeatherForecastController> logger, IOptions<ApiSettings> options)
    {
        _logger = logger;
        _apiSettings = options.Value;
    }

Вход в полноэкранный режим Выход из полноэкранного режима

Поставьте точку останова в констукторе и обратите внимание, что options был заполнен значением(ями) из нашего JSON-конфига, благодаря инъекции зависимостей и минимальной настройке конфигурации, которую мы сделали в предыдущем шаге. Только не забудьте определить параметры конфигурации IOptions<T> вместо просто T, что является распространенной ошибкой новичков. Помните, что конфигурация в .NET Core (а в настоящее время просто .NET) основана на IOptions.

Эй, а как насчет проектов без API?

Вы же не думали, что мы закончили? Ну, я думаю, если вам просто нужны примеры для проекта Web API, вы можете уйти. Но для всех остальных — если вы читали мою последнюю статью о Dependency Injection, вы можете помнить, что то, что делает добавление DI для не-веб проектов не простым, это то, как много scaffolding происходит автоматически с веб-проектами. То же самое верно и для конфигурации. Мы можем достичь тех же результатов в не-веб-проектах, нам просто нужно сделать немного больше тяжелой работы.

Шаг 1: Добавьте пакеты

  1. Microsoft.Extensions.Configuration
  2. Microsoft.Extensions.Configuration.Json
  3. Microsoft.Extensions.DependencyInjection
  4. Microsoft.Extensions.DependencyInjection.Abstractions
  5. Microsoft.Extensions.Options

Я предоставлю вам решать, какие версии использовать, но это основные пакеты, которые помогут нам начать работу.

Шаг 2: Добавьте конфигурационный файл

Я рекомендую добавить appsetting.json из нашего проекта Web API в качестве ссылки на наш консольный или тестовый файл, чтобы не пришлось заново все настраивать. О, и вы также захотите добавить ссылку на проект, в котором определен ваш класс ApiSettings — вероятно, проект Web API, если вы только что следовали этому руководству.

Шаг 3: Прибыль?

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using SampleNet6Api;

var config = new ConfigurationBuilder()
                 .SetBasePath(Directory.GetCurrentDirectory())
                 .AddJsonFile("appsettings.json")
                 .Build();

var services = new ServiceCollection()
   .AddOptions()
   .Configure<ApiSettings>(config.GetSection("ApiSettings"))
   .BuildServiceProvider();

var apiSettings = services.GetService<IOptions<ApiSettings>>();

Console.WriteLine(apiSettings.Value.ApiName);
Console.ReadLine();

Войдите в полноэкранный режим Выйти из полноэкранного режима

Выше приведено содержимое моего Program.cs в консольном проекте, но и для тестовых проектов все будет примерно так же.

Сначала мы создаем ConfigurationBuilder и заполняем его конфигом из нашего JSON-файла. Затем мы создаем ServiceCollection (контейнер .NET DI), добавляем в него IOptions и регистрируем наш класс ApiSettings из конфига. Эти два шага (за вычетом бита Configure) происходят автоматически под капотом веб-проектов.

Наконец, мы берем службу IOptions<ApiSettings> из DI-контейнера и записываем значение конфига в консоль. Это более или менее то, что произошло в конструкторе WeatherForecastController в нашем проекте Web API.

Вот и все. Счастливого кодинга (или, лучше сказать, конфигурирования), и до встречи!

Оцените статью
devanswers.ru
Добавить комментарий