• 定制ASP.NET 6.0的应用配置


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

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

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

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

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

    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自动实例化。

  • 相关阅读:
    jQuery的AJAX请求成功,但是跳转到error的解决方法
    leaflet中如何通过透明度控制layerGroup的显示隐藏
    pg_ctl: no database directory specified and environment variable PGDATA unset , centos 7 postgreSQL
    MyBatisPlus乐观锁: Parameter ‘MP_OPTLOCK_VERSION_ORIGINAL‘ not found. Available parameters are [
    mybatisplus自动填充踩坑
    Linux如何查找大文件或目录总结
    MyBatisPlus中updateById与updateAllColumnById方法区别
    java 正则表达式替换Spring @RequestMapping URL中的@PathVariable值
    swagger2 Illegal DefaultValue null for parameter type integer
    【MybatisPlus进阶学习(八)】SQL注入器
  • 原文地址:https://www.cnblogs.com/jackyfei/p/16308134.html
Copyright © 2020-2023  润新知