有没有适用于 .Net Standard 2.0 类库的通用配置文件?

36

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

该库一直从配置文件中读取诸如 SMTP 设置、连接字符串等项。

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

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

是否存在与先前示例类似的“可以工作”的 .Net Core 2.0 项目的等效配置文件?

我认为答案是否定的,但考虑到该库已在整个组织中使用,因此维护向后兼容性非常重要,我正在寻找最佳处理方式。


1
你的问题是否有些混淆?标题问的是 .net std,而加粗的部分问的是 .net core。 - Caius Jard
@casius,.NET Core 2 是 .NET Standard 2 的另一种实现方式。 - Norbert B.
1
@MattJohnson 我同意你的看法,但在我目前的情况下,我们有一个现有的库被广泛使用,因为 system.configuration 从 app.config 或 web.config 获取值,所以“只是工作”。是否有一种方法可以使用 DI 将配置文件推送到 .net core 项目中,以便该库可以以相同的方式找到这些值? - Brad Bamford
@T.S. - 你说得对。自从我最初写下那个评论以来,我的理解已经扩展了。我已经删除了我的评论。请你也这样做,这样我们就可以清理这个线程。 - Matt Johnson-Pint
2个回答

50

原来 System.Configuration.ConfigurationManager 已经在 .NETStandard 2.0 中添加了。

只需从 nuget 引用它并编译 .NETStandard 2.0 类库项目。

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

  • Net Core 2.0 项目使用 app.config
  • Web 项目 使用 web.config
  • 控制台应用Windows 应用 使用 app.config

这个能支持 .net core 应用程序中的 appsettings.json 吗? - gperrego
@gperrego 这个解决方案是一个通用配置,专门为您的.NETStandard 2+类库设计,您可以在您的.Net Core应用程序中引用它。appsettings.json是针对您的.net core应用程序的特定配置。它们之间没有关联。 - Brad Bamford
你能提供证明 System.Configuration.ConfigurationManager 是 .NET Standard 2.0 的一部分的文档吗? - G. Stoynev
我必须在dotnetstandard中创建一个客户端,该客户端需要在.net framework 4.5中使用。由于dotnetstandard 1.1仅支持此功能,因此我正在使用netstandard 1.1创建我的客户端,但是我找不到任何替代方法来读取其中的app.config文件。如何在netstandard 1.1应用程序中读取app.config文件? - RahulGo8u
点击答案中的链接并展开“Dependencies”部分。您会看到它受支持(.NETStandard 2.0)。| @G.Stoynev - InteXX

12

.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
  }
}

更多细节请查看文章配置ASP.NET Core应用程序

我担心保持向后兼容性会很困难(尽量避免使用词语“不可能”)。


为什么要将设置对象包装到IOptions中,而不是直接传递设置对象“SomeSettings”? - Ashar Syed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接