如何在.NET 5控制台应用程序中正确设置配置?

6
我有一个使用.NET Framework的控制台应用程序,现在想要升级到.NET 5,但是在需要从app.config获取数据的某些点上失败了。
关于配置工作方式的相关 文档非常有帮助,但所有示例都是控制台应用程序...直到你查看实际示例时才会发现它们完全没有帮助。它们都基于类似于以下代码块的Main块:
        static async Task Main(string[] args)
        {
            using IHost host = CreateHostBuilder(args).Build();

            // Application code should start here.

            await host.RunAsync();
        }

一个控制台应用程序并不是WinForms应用程序。应用程序代码不会在Main中“开始”;Main是您程序的主体,这意味着将使配置实际起作用的行放在方法末尾意味着它直到程序准备终止时才会被执行!您漏掉了什么?这些文档示例似乎完全没有意义。我不想托管任何服务;我只想让我的现有app.config在启动时被读取并提供给配置系统,就像在.NET Framework中一样。如何以正确的方式恢复旧的行为?

https://dev59.com/OVcO5IYBdhLWcg3waw6o - zaitsman
1
我想说这些只是例子。如果你没有托管任何服务,就不需要使用HostBuilder。只需按照@zaitsman的建议获取appsettings,然后执行你的代码即可。 - smoksnes
@smoksnes 获取哪些应用程序设置?我没有获取任何东西。我有一个第三方依赖项([linq2db](https://github.com/linq2db/linq2db)),它期望配置信息*只是在那里*,但它不起作用。我如何恢复以前的行为? - Mason Wheeler
@MasonWheeler,我写了一个答案,但后来意识到我并没有完全理解这个问题。你想要的“旧行为”是什么?你能用.NET Framework编写一个例子详细说明吗? - smoksnes
1
@MasonWheeler,是的。如果我没记错的话,它是依赖于ConfigurationManager的。它是/是static,可以在任何地方使用。在.NET Core(或.NET5)中,您可以使用ConfigurationBuilder构建IConfiguration。然后,通常将其注册到DI容器(ServiceProvider)中,并在需要时注入它。依赖于您的注册的类将在需要时注入IConfiguration。不,这与.NET Framework的情况并不完全相同。但这是因为.NET 5不像.NET Framework。 - smoksnes
显示剩余2条评论
2个回答

6

配置应该非常简单,配置生成器提供了更多选项,但这里的示例仅提供基本设置。

IConfiguration config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

如果你想在你的应用程序中使用DI模式,那么请使用方法。在你的构造函数中只需请求即可,否则你可以注入(不推荐)(不推荐)。

var serviceProvider = new ServiceCollection()
    .AddSingleton<IConfiguration>(config)
    .Configure<OptionConfig>(config.GetSection("ExampleSection"));
    .BuildServiceProvider();

当然,您将希望使用服务提供程序来输入第一个依赖项,从而构建您的“应用程序依赖树”。


对于那些希望使.NET Core项目像旧版(.NET Framework)配置一样工作的人进行编辑。

如果您想使用ConfigurationManager,可以使用Nuget包System.Configuration.ConfigurationManager向开发人员提供它。确保将配置文件命名为app.config,配置应该类似于以下内容。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="appconfigtest" value="abc" />
    </appSettings>
</configuration>

问题是,我并不直接使用它;它被第三方依赖项使用,因此我无法通过更改与配置系统设置无关的任何代码来修复它。 我需要它以前在.NET Framework中的工作方式正常运行。 - Mason Wheeler
@MasonWheeler 这个第三方依赖是用 .netstandard 写的吗? - Zach Hutchins
@MasonWheeler 我提供了一种在 .net core 中使用 ConfigurationManager 的替代方案。但是,如果你的依赖项在 .net framework 中,你可能会遇到问题,因为它可能与你的核心项目不兼容(不过还是值得一试的)。 - Zach Hutchins

0
我建议您可以使用 System.Configuration.ConfigurationManager。自 .NET Core 3.0 起,这个 ConfigurationManager.ConnectionStrings 已经成为 .NET Core Desktop 运行时的一部分(在 3.0 之前的版本中,System.Configuration.ConfigurationManager 可以作为外部 nuget 包使用)。
通过使用 System.Configuration.ConfigurationManager,您可以利用现有的 app.config 来用于您的控制台项目。
在控制台项目的 csproj 中,添加以下内容:
<PropertyGroup>
    <UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>

然后你可以引用System.Configuration.ConfigurationManager,添加using System.Configuration;并尝试使用下面的代码从ConfigurationManager.ConnectionStrings集合中获取第一个连接字符串:
var constring = ConfigurationManager.ConnectionStrings[0];

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