无法从.NET Core 2控制台应用程序中的config.json中读取数据

时间:2019-01-18 22:36:55

标签: c# configuration .net-core

我有以下代码。

IConfigurationRoot config = new ConfigurationBuilder()
  .SetBasePath(Directory.GetCurrentDirectory())
  .AddJsonFile("config.json", true, true)
  .Build();

string beep = config.GetSection("beep").Value;

我的 config.json 看起来像这样。

{ "beep": "bopp" }

当我遇到断点时,我可以看到有一个提供程序,但是其中的数据长度为零。我尝试了 config [“ beep”] 等其他方法,但是无法获取值。它一直都是 null 。我正在尝试遵循the docs,但必须缺少某些内容。

2 个答案:

答案 0 :(得分:1)

我觉得您只是缺少对象的名称。

尝试像这样在config.json中为对象添加名称:

{"beep":{"beep":"bopp"}}

然后您可以string beep =config.GetSection("beep").Value

答案 1 :(得分:1)

确保按照this blog中的讨论将json文件设置为复制到目录。否则,当您构建或调试配置文件时,将不会包含该文件。确保您在属性中进行了更改。

之所以无法访问您的配置,是因为IConfigurationRoot没有引用ConfigurationBuilder的依赖关系。为确保您的配置内容能够加载,请按照以下步骤进行操作:

public static class ConfigurationProvider
{
     public static IConfiguration BuildConfiguration => new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("appsettings.json", true, true)
          .Build();
}

以上内容将构建我们的配置,现在我们应该使用该配置。

public static class ServiceProvider
{
     public static IServiceProvider BuildServiceProvider(IServiceCollection services) => services
          .BuildDependencies()
          .BuildServiceProvider();
}

定义了提供程序后,我们可以执行以下操作,以便可以在应用程序中传递IConfiguration来访问对象。

var serviceCollection = new ServiceCollection()
     .AddSingleton(configuration => ConfigurationProvider.BuildConfiguration());

var serviceProvider = ServiceProvider.BuildServiceProvider(serviceCollection);

然后在另一个类中,您将具有以下内容:

public class SampleContext : ISampleRepository
{
     private readonly string dbConection;

     public SampleContext(IConfiguration configuration) => configuration.GetConnectionString("dbConnection");

     ...
 }

然后我们的appsettings.json如下所示:

{
  "ConnectionStrings": {
    "dbConnection": "..."
  }
}

以上是json对象的正确格式。如果沿这些行有嵌套对象:

{
     "Sample" : {
          "Api" : {
               "SampleGet" : "..."
          }
     }
}

那么您的C#为:

configuration.GetSection("Sample:Api")["SampleGet"];

以上内容是基于您的配置和使用情况不在同一顺序区域中(即直接在您的主区域中)的假设。另外,您应该使用appsettings.json,因为这是默认设置,如果我没记错的话,可以减少额外的接线。您的json也需要正确格式化。

但是,如果您需要更多帮助,请务必告诉我,我可以向您发送一些示例控制台核心应用程序以演示用法。