65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (5投票s)

2022 年 8 月 10 日

CPOL

3分钟阅读

viewsIcon

42426

如何向 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.csConfigureServices 方法中进行。

        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:添加包

  1. Microsoft.Extensions.Configuration
  2. Microsoft.Extensions.Configuration.Json
  3. Microsoft.Extensions.DependencyInjection
  4. Microsoft.Extensions.DependencyInjection.Abstractions
  5. 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 的构造函数中。

就这样了。祝您编码愉快(或者我应该说配置),稍后见!

© . All rights reserved.