Microsoft.Extensions.Configuration 究竟如何依赖于 ASP.NET 核心?

How exactly does Microsoft.Extensions.Configuration dependent on ASP.NET Core?

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

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

最初,我还没有打算围绕 ASP.NET 核心。我需要为我的简单控制台 C# 应用程序(VS 代码和 .NET Core)存储一些配置。我发现很多主题(例如这里:)需要阅读 JSON(推荐)配置。鉴于此,我添加了三个必要的金块包:

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

我需要使用:

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

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

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

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

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

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

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

Microsoft.Extensions.Configuration, like other packages in the Microsoft.Extensions namespace (e.g. Options, or DependencyInjection),是作为 ASP.NET 核心框架的一部分创建的包。然而,ASP.NET 核心及其所有相关包的构建方式是一种非常模块化的方式,因此所有库都可以在 ASP.NET 核心上下文中使用,也可以不使用。

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

综上所述,您如何使用这些包?就像任何其他库一样,您只需向它添加一个 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 though. It may be about the configuration used inside of ASP.NET Core but the underlying concepts still apply (e.g. how configuration paths look like, or how binding works).

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

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