29

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

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

最初,我还没有打算围绕 ASP.NET Core。我需要为我的简单控制台 C# 应用程序(VS Code 和 .NET Core)存储一些配置。我发现了很多主题(例如这里:如何从控制台应用程序中的 config.json 读取值)来读取 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 功能。

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

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

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

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

也许我应该使用除了ConfigurationBuilder阅读 JSON 之外的东西?

4

1 回答 1

63

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

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

综上所述,您如何使用这些软件包?就像任何其他库一样,您只需向它添加一个 NuGet 引用。由于Microsoft.Extensions.Configuration基本库,它没有任何加载文件的工具,Microsoft.Extensions.Configuration.Json如果你想加载 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"
    }
}

所以你可以像这样加载配置。请务必仍然检查文档。它可能与 ASP.NET Core 内部使用的配置有关,但底层概念仍然适用(例如配置路径的外观,或绑定的工作方式)。

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

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

于 2018-09-03T22:05:15.793 回答