Добрый день, ребята!
В продолжение моего последнего поста о 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: Добавьте пакеты
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.DependencyInjection.Abstractions
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.
Вот и все. Счастливого кодинга (или, лучше сказать, конфигурирования), и до встречи!