【问题标题】:Is there a universal config file for .Net Standard 2.0 Class Library?.Net Standard 2.0 类库是否有通用配置文件?
【发布时间】:2018-04-27 20:29:42
【问题描述】:

我有一个类库,我将其转换为 .Net Standard 2 类库,以便在 ASP.Net Core 2.0 项目中使用。

该库始终从配置文件中读取 SMTP 设置、连接字符串等项目。

在 Web 项目中,它会在 web.config 中找到这些值。

在 Console/WinForms 中,它会在 app.config 中找到这些值。

.Net Core 2.0 项目是否有与前面的示例一样“正常工作”的等效配置文件?

我认为答案是否定的,但考虑到整个组织都在使用该库,因此寻找处理此问题的最佳方法,因此保持向后兼容性很重要。

【问题讨论】:

  • 您的问题是否困惑?标题询问.net std,粗体询问.net core
  • @casius .net core 2 是 .net 标准 2 的安德斯实现。
  • @MattJohnson 我同意,但在我目前的情况下,由于 system.configuration 从 app.config 或 web.config 获取值,我们有一个大量使用的现有库“正常工作”。有没有办法使用 DI 将配置文件推送到 .net 核心项目中,以便该库可以以相同的方式找到这些值?
  • @T.S. - 你是对的。自从我最初写那篇文章以来,我的理解有所扩展。我已经删除了我的评论。请做同样的事情,以便我们清理这个线程。

标签: asp.net .net asp.net-core


【解决方案1】:

原来System.Configuration.ConfigurationManager 已添加回 .NETStandard 2.0。

只需从 nuget 中拉入并编译 .NETStandard 2.0 类库项目。

然后,该库将使用标准配置文件跨项目工作:

  • Net Core 2.0 项目使用 app.config
  • Web 项目通过 web.config 工作
  • 控制台Windows应用与app.config一起使用

【讨论】:

  • 这会在 .net 核心应用中支持 appsettings.json 吗?
  • @gperrego 此解决方案是专门为您的 .NETStandard 2+ 类库提供的通用配置,然后您可以在您的 .Net Core 应用程序中引用它。 appsettings.json 是特定于您的 .net 核心应用程序的配置。它们不相关。
  • 您能否提供说明“System.Configuration.ConfigurationManager”是 .NET Standard 2.0 一部分的文档?
  • 我必须在 dotnetstandard 中创建一个需要在 .net framework 4.5 中使用的客户端。由于 dotnetstandard 1.1 只支持这个,所以我在 netstandard 1.1 中创建我的客户端。但我可以找到任何替代方法来读取 app.config 文件。如何在 netstandard 1.1 应用程序中读取 app.config 文件?
  • 单击答案中的链接并展开“依赖项”部分。您会在那里看到它受支持 (.NETStandard 2.0)。 | @G.Stoynev
【解决方案2】:

.Net Core 大大修改了配置方式。

当您需要某些设置的价值时,您不再调用ConfigurationManager.AppSettings["someSetting"]。相反,您在应用程序启动时使用ConfigurationBuilder 加载配置。可能有多个配置源(json 或/和 xml 配置文件、环境变量、命令行、Azure Key Vault...)。

然后您构建您的配置并将包装到 IOption<T> 中的强类型设置对象传递给消费类。

以下是其工作原理的基本概念:

//  Application boostrapping

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

//  IServiceCollection services

services.AddOptions();
services.Configure<SomeSettings>(configuration.GetSection("SomeSection"));

//  Strongly typed settings

public class SomeSettings
{
    public string SomeHost { get; set; }

    public int SomePort { get; set; }
}

//  Settings consumer

public class SomeClient : ISomeClient
{
    public SomeClient(IOptions<SomeSettings> someSettings)
    {
        var host = someSettings.Value.SomeHost;
        var port = someSettings.Value.SomePort;
    }
}

//  AppSettings.json

{
  "SomeSection": {
    "SomeHost": "localhost",
    "SomePort": 25
  }
}

更多详情请查看文章Configure an ASP.NET Core App

恐怕很难(尽量避免使用“不可能”这个词)来保持向后兼容性。

【讨论】:

  • 为什么要将设置对象包装到IOptions中,为什么不直接传递设置对象'SomeSettings'?
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多