6

定制ASP.NET 6.0的应用配置 - 张飞洪[厦门]

 2 years ago
source link: https://www.cnblogs.com/jackyfei/p/16308134.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。

本文的主题是应用程序配置。要介绍的是如何使用配置、如何自定义配置,以采用不同的方式配置。也许您已经有了现有的XML配置,或者希望在不同的应用上共享YAML配置文件,或者从数据库中读取配置值,总之,配置是我们绕不开的话题。

本文,我们将讨论以下主题:

  • 设置配置文件
  • 使用类型化配置
  • 使用初始化(INI)文件进行配置
  • 配置提供程序

本文中的主题仍然是处在ASP.NET CoreHost层:

127185-20220525093129922-88245136.png

2.1设置配置文件

让我们从各种配置选项开始,自ASP.NET Core2.0 ,为了确保Startup.cs的干净和简单,配置被隐藏在WebHostBuilder的默认配置中,不再是Startup.cs的一部分。

ASP.NET Core3.1到ASP.NET Core 5.0,代码如下所示:

public class Program {     
public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Run();     
}     

public static IHostBuilder CreateHostBuilder(string[] args) => 
    Host.CreateDefaultBuilder(args).
    ConfigureWebHostDefaults(webBuilder =>{ 
        webBuilder.UseStartup(); 
    }
}

ASP.NET Core 6.0中,为了进一步的简化,Microsoft引入了最小应用程序编程接口(API)方法:去除Startup.cs文件,把所有的配置放在在Program.cs文件中,让我们看看是什么样子:

Var builder = WebApplication.CreateBuilder(args); 
// Add services to the container. 
builder.Services.AddControllersWithViews(); 
var app = builder.Build();

上面两个版本都自带默认配置,也支持自定义配置。我们可以使用ConfigureAppConfiguration()方法扩展了IWebHostBuilder

下面是ASP.NET Core3.1到ASP.NET Core 5.0中的使用最小API方法时的定制代码:

Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
{         
    webBuilder.ConfigureAppConfiguration((builderContext,config) =>
    {             
        //这里是配置内容     
    }).UseStartup();     
});

您还可以使用ConfigureAppConfiguration来配置应用程序配置:

builder.WebHost.ConfigureAppConfiguration((builderContext, config) => 
{     
    //这里是配置内容
});

还有一种更简单的方法,通过访问builderConfiguration属性:

builder.Configuration.AddJsonFile("appsettings.json",optional: false,reloadOnChange: true);

当我们创建ASP.NET Core项目,会生成一些默认的配置文件,比如appsettings.jsonappsettings.Development.json,大多数ASP.NET Core开发人员会使用默认的配置文件来配置。

以下展示了一段用于读取appsettings.json的默认代码:

var env = builder.Environment; 
builder.Configuration.SetBasePath(env.ContentRootPath); 
builder.Configuration.AddJsonFile("appsettings.json",optional: false,reloadOnChange:true); 
builder.Configuration.AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true,reloadOnChange:true); 
builder.Configuration.AddEnvironmentVariables();

该配置通过环境变量设置了应用程序的基本路径,这里使用AddEnvironmentVariables()配置方法是一种最佳实践。另外,配置顺序也很重要,后添加的配置将覆盖之前添加的配置,这里的环境变量始终做最后的覆盖。

IConfigurationBuilder有很多扩展方法可以添加更多配置,例如XML或INI配置文件和内存配置,甚至您也可以在社区了找到的其他配置提供程序,以读取YAML文件、数据库值等。

2.2 使用类型化配置

在尝试读取INI文件之前,有必要了解如何使用类型化配置,而不是通过IConfiguration逐键读取配置。要读取类型化配置,需要定义待配置的类型。假设我们创建一个名为AppSettings的类,如下所示:

namespace ConfigureSample; 
public class AppSettings {     
    public int Foo { get; set; }     
    public string Bar { get; set; }
}

这是一个简单的POCO类,然后,我们可以在Startup.csConfigureServices方法内填充这些类。直到ASP。NET Core 5.0:

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

使用迷你API(minimal API)方法,配置如下所示:

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

这样,类型化配置也可以在依赖注入(DI)容器中注册为服务,并且可以在应用程序中的任何地方使用。您可以为每个配置创建不同的配置类型。在大多数情况下,一个配置足以应对,但有时为了需要会将配置划分为不同的配置。

下面的代码演示了如何在MVC控制器中使用类型配置:

using Microsoft.Extensions.Options; 
// ... 
public class HomeController : Controller {     
    private readonly AppSettings _options;     
    public HomeController(IOptions<AppSettings> options)     
    {         
        _options = options.Value;     
    }     
    public IActionResult Index()     
    {         
        ViewData["Message"] = _options.Bar;         
        return View();     
    }
}

IOptionsAppSettings类型的包装器,Value属性包含AppSettings类的实例,包括配置文件中的值。

要读取设置,需要先在appsettings.json文件中配置AppSettings部分,否则值将为null或未设置。现在,让我们将该部分添加到appsettings.json文件,如下所示:

{
    "Logging": { "LogLevel": { "Default": "Warning" }},
    "AllowedHosts": "*", 
    "AppSettings": {"Foo": 123,"Bar": "Bar"} 
}

2.3 使用INI文件进行配置

要使用INI文件来配置应用程序,您需要在Program.csConfigureAppConfiguration()方法中添加INI配置,如下所示:

builder.Configuration.AddIniFile("appsettings.ini",optional: false,reloadOnChange: true); 
builder.Configuration.AddJsonFile($"appsettings.{env.EnvironmentName}.ini", optional: true, reloadOnChange: true);

此代码以与JSON配置文件加载方式相同。第一行是必需的配置,第二行是可选的配置,具体取决于当前运行时环境。

INI文件可能如下所示:

[AppSettings] Bar="FooBar"

此文件包含一个名为AppSettings和一个名为Bar的属性。

前面我们说过,配置的顺序很重要。如果通过JSON文件进行配置之后再添加两行有关INI文件的配置,INI文件将覆盖JSON文件中的设置,Bar属性值将被FooBar覆盖。此外,INI文件中的值将通过之前创建的类型化配置提供。

其他所有配置提供程序都将以相同的机制工作。

2.4 配置提供程序

配置提供程序是IConfigurationProvider的实现,它是由配置源创建的(配置源是IConfigurationSource的实现)。配置提供程序从配置源头读取数据,并通过字典对外提供数据。

将自定义或第三方配置提供程序添加到ASP.NET Core中,您需要调用ConfigurationBuilder上的Add方法添加配置源:

// add new configuration source 
builder.Configuration.Add(new MyCustomConfigurationSource { 
    SourceConfig = //配置数据来源     
    Optional = false,  
    ReloadOnChange = true 
});

通常,我们会创建一个扩展方法来更优雅地添加配置源,如下所示:

builder.Configuration.AddMyCustomSource("source", optional: false, reloadOnChange: true);

2.4 回顾

其实在大多数情况下,我们不需要添加其他配置提供程序或创建自己的配置提供程序,但是为了以防万一,但最好知道如何定制它。此外,使用类型化配置是读取和提供设置的好方法。在经典的ASP.NET中,我们往往使用手动的方式读取配置,现在,我们只需提供一个类型即可自动完成此操作,因为该类型将通过DI自动实例化。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK