【问题标题】:How exactly does Microsoft.Extensions.Configuration dependent on ASP.NET Core?Microsoft.Extensions.Configuration 究竟如何依赖 ASP.NET Core?
【发布时间】:2019-02-08 21:47:56
【问题描述】:

ASP.NET Core 是否实现IConfiguration 访问配置值?

我的问题很可能是因为我不明白 ASP.NET Core 到底是什么。好吧,我知道它是一个 Web 框架,不确定,但看起来它是 .NET 中的命名空间,或者是一个包......我知道在 php 中,一个框架可以是一组类(命名空间)或编译库是作为扩展提供的,所以我认为 .NET 中也有类似的方法。

最初,我还没有打算围绕 ASP.NET Core。我需要为我的简单控制台 C# 应用程序(VS Code 和 .NET Core)存储一些配置。我发现了很多主题(例如这里:How to read values from config.json in Console Application)来阅读 JSON(推荐)配置。鉴于此,我添加了三个必要的 nugget 包:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.FileExtensions;
using Microsoft.Extensions.Configuration.Json;

我需要使用:

new ConfigurationBuilder()          
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json").Build();

这将返回一个实现IConfigurationRoot/IConfiguration 接口的对象。但是所有示例都是在 ASP.NET Core 上下文中给出的。我有一个非常简单的应用程序,我还不需要任何 ASP.NET 功能。

所以我尝试在没有 ASP.NET 的情况下访问 IConfigurationRoot。结果对象存储配置文件中的值,但没有其接口的所有方法来访问它们。

如何在 .NET 命名空间的上下文中解释这一点? ASP.NET Core 是否实现了从 IConfiguration 访问值的方法,例如 Get<T>()

如果Microsoft.Extensions.ConfigurationMicrosoft.AspNetCore.App 的一部分或严重依赖于Microsoft.AspNetCore.App,为什么它在不同的命名空间中?

如果我添加 ASP.NET Core(NuGet 包和命名空间),会不会有点矫枉过正?

也许我应该使用 ConfigurationBuilder 以外的其他东西来读取 JSON?

【问题讨论】:

  • IMO 有点矫枉过正。您可以使用 JSON.NET 库 (NewtonSoft.Json NuGet) 执行 string json = File.ReadAllLines("path"); var deserialized = JsonConvert.DeserializeObject<SomeClass>(json);

标签: c# asp.net-core .net-core asp.net-core-configuration


【解决方案1】:

Microsoft.Extensions.ConfigurationMicrosoft.Extensions 命名空间中的其他包(例如 OptionsDependencyInjection)一样,是作为 ASP.NET Core 框架的一部分创建的包。然而,ASP.NET Core 及其所有相关包的构建方式是非常模块化的,因此所有库都可以在 ASP.NET Core 上下文中使用,也可以不使用。

您必须将这些包理解为库。它们包含在 ASP.NET Core 中,因为框架在它们之上构建,但是如果您不需要 ASP.NET Core Web 框架,您仍然可以单独使用这些库,而无需提及 ASP .NET 核心。这实际上就是为什么它们位于 Microsoft.Extensions 命名空间而不是 Microsoft.AspNetCore 中的原因:它们是完全独立的项目。当然,这些包的开发是由 ASP.NET Core 团队完成的,ASP.NET Core 的设计决策确实会影响这些扩展包的发展方式;但是团队对这些包非常小心,因此不影响一般使用。

综上所述,您如何使用这些软件包?就像任何其他库一样,您只需向它添加一个 NuGet 引用。由于Microsoft.Extensions.Configurationbase 库,它没有任何加载文件的功能,如果你想加载JSON 文件,你还需要Microsoft.Extensions.Configuration.Json

但这真的很简单:

var configuration = new ConfigurationBuilder()
    .AddJsonFile("config.json")
    .Build();

// retrieve configuration values
Console.WriteLine(configuration["foo"]); // bar
Console.WriteLine(configuration["baz:bar"]); // qux

对于这个例子,config.json 看起来像这样:

{
    "foo": "bar",
    "baz": {
        "bar": "qux"
    }
}

所以你可以像这样加载配置。不过请务必检查the documentation。它可能与 ASP.NET Core 内部使用的配置有关,但底层概念仍然适用(例如 how configuration paths look likehow binding works)。

最后,请注意,这实际上只是用于配置。从 JSON 加载数据只是您可以使用 Microsoft.Extensions.Configuration 的众多配置源之一。但无论您将使用哪个提供程序,您最终都会得到具有节和关键路径概念的相同配置格式。

如果您在查看如何解析 JSON 时来到该软件包,那么您很可能正在查看错误的工具。如果您想解析 JSON 以检索适当的数据结构,就像您在使用 JSON 作为序列化数据的方式时使用的那样,那么您应该看看不同的东西。解析 JSON(也是序列化)最常见的解决方案是使用 Json.NET,这是一个非常强大且灵活的工具,可以处理任何类型的 JSON 数据。

【讨论】:

  • 哇。这是全面(且快速)的答案。非常感谢。我可能会使用 Json.NET,因为我只需要存储要从 excel wb 读取的工作表名称和表格标题行号。我仍然会尝试让Microsoft.Extensions.Configuration 为学习目的工作。
  • 很好的答案!
猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2017-05-13
  • 2022-01-27
  • 2019-12-23
  • 2010-09-07
  • 2020-04-03
  • 2020-01-27
相关资源
最近更新 更多