使用 IOptions 模式向 .NET 6 项目添加配置






4.38/5 (5投票s)
如何向 Web API 和其他项目类型添加配置
继我上一篇关于依赖注入的文章之后,我想用一个最新的配置添加指南来补充它。我们将从 Web API 开始(因为它最简单),然后看看如何向其他项目类型(如控制台应用程序或测试)添加配置。
让我们从 API 开始
如果在 Visual Studio 中创建一个新的 Web API 项目,您将看到一些默认文件,但与我们相关的是
-
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,那么这将在 Startup.cs 的 ConfigureServices
方法中进行。
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();
上面是您的 .NET6 Web API 的自动生成的 Program.cs 内容。在对 builder
调用 Build
之前,添加以下内容
builder.Services.Configure<ApiSettings>
(builder.Configuration.GetSection("ApiSettings"));
这将注册我们的 ApiSettings
配置节,并将其与我们先前创建的强类型类关联,并将其注册到 .NET 依赖注入容器中。
步骤 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 项目的示例,您可以现在离开了。但是对于其他人 - 如果您阅读了我上一篇关于依赖注入的文章,您可能会记得,对于非 Web 项目来说,添加 DI 不那么直接的原因是 Web 项目自动发生了很多脚手架。配置也是如此。我们可以在非 Web 项目中获得相同的结果,我们只需要自己做更多繁重的工作。
步骤 1:添加包
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.DependencyInjection.Abstractions
Microsoft.Extensions.Options
我让您决定使用什么版本 - 但这些是让我们开始的核心包。
步骤 2:添加配置文件
我建议将 Web API 项目中的 appsetting.json 作为链接添加到我们的控制台或测试文件,只是为了节省重新配置所有内容。哦,您还需要添加对定义了 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
位)在 Web 项目中自动在后台发生。
最后,我们从 DI 容器中获取 IOptions<ApiSettings>
服务并将配置值写入控制台。这或多或少发生在我们的 Web API 项目中 WeatherForecastController
的构造函数中。
就这样了。祝您编码愉快(或者我应该说配置),稍后见!