【问题标题】:ASP.net Core 2.2 configurationASP.net Core 2.2 配置
【发布时间】:2019-07-30 21:37:32
【问题描述】:

来自 webforms 背景,我试图了解配置和环境转换在 .net core 2.2 MVC web 应用程序中的工作原理。 web.config 文件和 ConfigurationSettings.AppSettings 属性已不复存在。我发现documentation 有点不清楚。

文档说明我需要在应用程序启动期间调用AddJsonFileAddXmlFile。像这样:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory());
            config.AddJsonFile(
                "config.json", optional: true, reloadOnChange: true);
        })
        .UseStartup<Startup>();

我使用的项目模板已经有如下逻辑:

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

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

我的项目有 appsettings.json 和 appsettings.development.json 文件。当我在 Startup 类的 Startup 方法上设置断点时,我可以检查配置参数并看到两个 json 配置文件暴露为看起来像字典的文件。

问题

  1. 那么我是否必须显式调用 AddJSonFile,或者这实际上是由框架以某种方式为我完成的?

  2. 如何处理不同部署的转换配置?

  3. 在控制器中访问此配置的最佳方式是什么?

【问题讨论】:

标签: asp.net-core


【解决方案1】:

那么我是否必须显式调用 AddJSonFile,或者这实际上是由框架以某种方式为我完成的?

这是在框架中完成的。最值得注意的是“DefaultBuilder”添加了 appsettings.json 和 appsettings.{Environment}.json 等。 https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.webhost.createdefaultbuilder?view=aspnetcore-2.2

如何处理不同部署的转换配置?

您需要在主机上设置环境变量(这是最简单的方法,但这里还有其他方法)。因此,例如,如果您将环境设置为生产,那么它将首先加载 appsettings.json,然后将加载 appsettings.Production.json 并覆盖默认设置。更多信息在这里:https://dotnetcoretutorials.com/2017/05/03/environments-asp-net-core/

在控制器中访问此配置的最佳方式是什么?

有两种方法。您可以使用框架中内置的选项模式:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-2.2

或者您可以使用老式的 POCO (https://dotnetcoretutorials.com/2016/12/26/custom-configuration-sections-asp-net-core/)。

你需要做的就是在你的 ConfigureServices 方法中加载你的配置并将它绑定到一个单例:

services.AddSingleton(Configuration.GetSection("myConfiguration").Get<MyConfiguration>());

然后你可以简单地通过 DI 在你的控制器中请求它:

public class ValuesController : Controller
{
 private readonly MyConfiguration _myConfiguration;

 public ValuesController(MyConfiguration myConfiguration)
 {
 _myConfiguration = myConfiguration;
 }
}

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2019-06-15
    • 1970-01-01
    • 2019-08-09
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多