【问题标题】:Strongly Typed Configuration Settings in .NET Core 2 Console Application.NET Core 2 控制台应用程序中的强类型配置设置
【发布时间】:2018-11-17 02:10:21
【问题描述】:

我想使用强类型类访问 appsettings.json 文件(可能还有其他配置文件)。 有很多关于在 .NET Core 1 中这样做的信息(例如https://weblog.west-wind.com/posts/2016/may/23/strongly-typed-configuration-settings-in-aspnet-core),但几乎没有关于 .NET Core 2 的信息。

此外,我正在构建一个控制台应用程序,而不是 ASP.NET。

.NET Core 2 中的配置 API 似乎已完全改变。我无法解决。任何人?

编辑:我认为 Core 2 文档可能还没有赶上。示例:https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.configuration.configurationbinder?view=aspnetcore-2.0 表示,您会认为 ConfigurationBinder 存在于 .NET Core 2 中,但 Microsoft.Extensions.Configuration 和 Microsoft.Extensions.Options 的对象浏览器搜索没有显示任何内容。

我已经使用 NuGet 控制台来

  • 安装包 Microsoft.Extensions.Options -Version 2.0.0
  • 安装包 Microsoft.Extensions.Configuration -Version 2.0.0

【问题讨论】:

  • ConfigurationBinderMicrosoft.Extensions.Configuration.Binder NuGet 包中..

标签: c# configuration .net-core console-application .net-core-2.0


【解决方案1】:

感谢 Martin Ullrich 的观察,这导致了解决方案。这里有几件事在起作用:

  • 我对 DLL 级引用感到生疏,因为旧样式的“引用”(与 .NET Core 中的新“依赖项”相反)隐藏了所有这些
  • 我假设安装 NuGet Microsoft.Extensions.Configuration 包将安装子命名空间 DLL。事实上,NuGet 库中有许多软件包(请参阅here)。 NuGet 控制台不会告诉您具体获取哪些 DLL,但安装后您可以在解决方案浏览器中看到它们:
    而且,在 API Browser 中搜索 ConfigurationBinder 不会产生任何结果,我猜是因为它是扩展库的一部分。
  • Rick Strahl 在他的帖子中确实提到了它(链接在问题中),但我仍然错过了它:例如,Bind 方法看起来很像 ConfigurationBinder 上的静态方法。但实际上它是一种扩展方法。因此,它会在安装 NuGet 包时神奇地出现。这使我们严重依赖文档,而我还没有完全解决。

因此,总而言之,解决方案是:

  • 安装包 Microsoft.Extensions.Configuration.Binder -Version 2.0.0
  • 安装包 Microsoft.Extensions.Configuration.Json-Version 2.0.0

第一个给出.Bind 方法,第二个给出.SetBasePath.AddJsonFile 方法。

我会在一天左右的时间内将最终代码添加到这里。

编辑:

public class TargetPhoneSetting {
    public string Name { get; set; } = "";
    public string PhoneNumber { get; set; } = "";
}

public class AppSettings {
    public List<TargetPhoneSetting> TargetPhones { get; set; } = new List<TargetPhoneSetting>();
    public string SourcePhoneNum { get; set; } = "";
}

public static AppSettings GetConfig() {
    string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

    var builder = new ConfigurationBuilder()
        .SetBasePath(System.IO.Directory.GetCurrentDirectory())
        .AddYamlFile("appsettings.yml", optional: false)
        ;
    IConfigurationRoot configuration = builder.Build();

    var settings = new AppSettings();
    configuration.Bind(settings);

    return settings;
}

请注意,上面的代码实际上是针对 YAML 配置文件的。您将需要调整加载 YAML 的单行以使用 JSON。我没有测试过这些,但它们应该很接近:

JSON:

{
  "SourcePhoneNum": "+61421999999",

  "TargetPhones": [
    {
      "Name": "John Doe",
      "PhoneNumber": "+61421999888"
    },
    {
      "Name": "Jane Doe",
      "PhoneNumber": "+61421999777"
    }
  ]
}

YAML:

SourcePhoneNum: +61421999999
TargetPhones:
    - Name: John Doe
      PhoneNumber: +61421999888
    - Name: Jane Doe
      PhoneNumber: +61421999777

【讨论】:

  • 非常感谢您添加支持的 appsettings.json。谢谢。
  • 添加了示例文件
  • 好的,这帮助我弄清楚了一些巫术。 “public List TargetPhones”是有用的行。它必须是列表(而不是 ICollection 或 IEnumerable)......到..我不知道..可以实例化或其他东西。我在这里找到了类似的评论:weblog.west-wind.com/posts/2016/May/23/… 查找 Sean Fackrell 的评论
  • 很好,我记得我也花了一些时间才意识到这一点。作为参考,评论是:Sean Fackrell - “如果有人偶然发现这个。你不能像使用普通 JSON 反序列化一样在配置 POCO 中使用 'IEnumerable' 或 'IList'。如果你这样做,你会得到解析 IOptions 时出现 InvalidOperation 异常。您必须改用 List 或可能是可以构造的类型"
猜你喜欢
  • 2016-11-02
  • 2016-12-07
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2017-08-21
  • 2019-08-15
相关资源
最近更新 更多