文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

配置

不幸的是,一个新开始的 ASP.NET Core 应用并不包含一个完整的示例配置。这让新手在开始新应用时有点困难。新的 Configuration 比老的要好很多,而且默认会添加一些有意义的配置。现在我们开始一个新项目吧。

打开 Startup.cs 然后浏览下控制器的代码。已经有一些类似配置启动的代码。这是新建项目要运行所需要的。

public Startup(IHostingEnvironment env)
{
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
        // This will push telemetry data through Application Insights 
        // pipeline faster, allowing you to view results immediately.
        builder.AddApplicationInsightsSettings(developerMode: true);
    }
    Configuration = builder.Build();
}
第 1 段(可获 1.04 积分)

但大多数情况下你需要更多的配置。这段代码创建了一个 ConfigurationBuilder 实例并添加一个 appsettigns.json 以及环境变量到 ConfigurationBuilder 实例中。在开发模式中,同事增加了 ApplicationInsights 的设置。

如果你查看了 appsettings.json ,会发现一个名为 ApplicationInsights 的键以及一些日志相关的设置(如果你选择独立认证,则将会看到一个连接字符串):

{
  "ApplicationInsights": {
    "InstrumentationKey": ""
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Verbose",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}
第 2 段(可获 0.8 积分)

我们需要在哪里存储我们自定义的应用配置呢?

我们可以使用这个 appsettings.json 文件或者其他任意的 JSON 文件来存储配置。下面我们用一个已有的文件并添加新的配置部分 AppSettings:

{
    ...

    "AppSettings" : {
        "ApplicationTitle" : "My Application Title",
        "TopItemsOnStart" : 10,
        "ShowEditLink" : true
    }
}

看起来很棒,但如何来读取这些设置呢?

在 Startup.cs 中,配置已经进行构建,使用的方法如下:

var configurationSection = Configuration.GetSection("AppSettings");
var title = configurationSection.Get<string>("ApplicationTitle");
var topItmes = configurationSection.Get<int>("TopItemsOnStart");
var showLink = configurationSection.Get<bool>("ShowEditLink");
第 3 段(可获 0.74 积分)

我们也可以在配置缺失的情况下提供默认值:

var topItmes = configurationSection.Get<int>("TopItemsOnStart", 15); 

如果想要这些配置在其他地方使用,可以注册 IConfigurationRoot 到依赖的注入容器:

services.AddInstance<IConfigurationRoot>(Configuration); 

但这个看起来不像是一个为应用提供配置的真正有用的方法。看起来像是前一个版本的老套做法。而新的配置要好很多。在前一个版本,我们创建了一个配置门面来封装了配置项来读取带类型的配置,而不是直接访问配置对象。

第 4 段(可获 1.24 积分)

现在我们只需要创建一个简单的 POCO 来在应用中提供对配置的全局访问:

public class AppSettings
{
    public string ApplicationTitle { get; set; }
    public int TopItemsOnStart { get; set; }
    public bool ShowEditLink { get; set; }
}

该类的属性直接与配置中的内容匹配。但完整这个时,我们就可以将配置段映射到 AppSettings 类:

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

这将配置中的值填充到 AppSettings 类中。这个代码同时将配置信息添加到 IoC 容器中,这样我们就可以在应用的任何地方通过获取 IOptions<AppSettings> 来访问这些值:

第 5 段(可获 1.03 积分)
public class HomeController : Controller
{
    private readonly AppSettings _settings;

    public HomeController(IOptions<AppSettings> settings)
    {
        _settings = settings.Value;
    }

    public IActionResult Index()
    {
        ViewData["Message"] = _settings.ApplicationTitle;
        return View();
    }

我们也可以直接在视图中这么做:

@inject IOptions<AppSettings> AppSettings
@{
    ViewData["Title"] = AppSettings.Value.ApplicationTitle;
}
<h2>@ViewData["Title"].</h2>
<ul>
    @for (var i = 0; i < AppSettings.Value.TopItemsOnStart; i++)
    {
        <li>
            <span>Item no. @i</span><br/>
            @if (AppSettings.Value.ShowEditLink) {
                <a asp-action="Edit" asp-controller="Home"
                   asp-route-id="@i">Edit</a>
            }
        </li>
    }
</ul>
第 6 段(可获 0.11 积分)

使用这个方法你就可以根据需要来创建很多配置段,而且你可以为你的应用提供任意多的配置对象。

你觉得如何? 有任何问题可以直接在评论里分享。

环境相关的配置

现在我们需要为不同的部署环境使用不同的配置。假设我们有一个产品、测试以及开发环境。所有这些环境需要不同的配置,不同的连接字符串,不同的邮箱设置以及 Azure 访问的密钥等等。

第 7 段(可获 1.14 积分)

现在回到 Startup.cs to 看看构造器,我们可以使用 IHostingEnvironment 来为不同的环境加载不同的 appsettings.json 文件。但是可以以一种更优雅的方式进行:

.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)

我们可通过环境特定的名称来加载另外的 JSON 文件,并将参数 optional 设置为 true。这就是说 appsettings.json 包含了产品以及默认的设置,而 appsettings.Staging.json 包含了测试相关的配置。如果我们运行在测试模式下,那么程序会加载第二个配置,已有的配置将被新的所覆盖。我们只需要指定我们要覆盖的配置而已。

第 8 段(可获 1.33 积分)

设置 optional 参数为 true 表示该配置文件可能不存在。使用这个方法你可以将一些默认的配置提交到代码仓库,而一些绝密的信息如访问密钥和连接字符串可以存储在 appsettings.Development.json 中,而 appsettings.staging.json 和 appsettings.Production.json 放在构建服务器或者 Web 服务器上。

结论

正如你所看到的,ASP.NET Core 的配置已经非常简单。你只需要知道如何做就可以。因为这在一个全新项目中并非直接可见,所以对刚刚上手的人来说会有点困难。

第 9 段(可获 1.21 积分)

文章评论