【问题标题】:How to properly set up configuration in a .NET 5 console app?如何在 .NET 5 控制台应用程序中正确设置配置?
【发布时间】:2021-10-25 14:02:45
【问题描述】:

我有一个 .NET Framework 控制台应用程序正在尝试更新到 .NET 5,但它在某些需要来自 app.config 的数据的点上失败了。

关于配置如何工作的relevantdocumentation 现在将其所有示例作为控制台应用程序非常有帮助...直到您真正查看示例,这些示例完全没有帮助。它们都基于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 中工作的方式一样。恢复旧行为的正确方法是什么?

【问题讨论】:

  • @zaitsman 是的,怎么样?
  • 我会说这些只是示例。如果您不托管任何服务,则无需使用HostBuilder。只需按照@zaitsman 的建议获取appsettings,然后执行您的代码。
  • @smoksnes 获取什么应用设置?我什么都没拿。我有一个第三方依赖项 (linq2db),它期望配置信息就在那里,但它不起作用。如何恢复以前的行为?
  • @MasonWheeler,是的。如果我没记错的话,它取决于ConfigurationManager。它是/是static,可以在任何地方使用。在 .Net Core(或 .NET5)中,您可以使用 ConfigurationBuilder 构建您的 IConfiguration。然后,您通常将其注册到您的 DI 容器 (ServiceProvider) 并将其注入您需要的地方。然后,取决于您的注册的课程将在需要时注入IConfiguration。和不。这与 .NET Framework 不完全一样。但那是因为 .NET 5 不像 .NET Framework。

标签: c# configuration .net-5


【解决方案1】:

对于较小的项目,我可能只是手动创建一个新项目并将文件从旧版本移到那里,然后删除旧项目。

对于更大、更复杂的项目,迁移可能是最简单的方法。这可能会帮助您: https://docs.microsoft.com/en-us/dotnet/architecture/modernize-desktop/example-migration

【讨论】:

  • 这并没有解释如何让配置在任何一种方法中工作。
【解决方案2】:

设置配置应该非常困难,配置生成器提供了更多选项,但这里是本示例的基本内容。

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

如果您想在您的应用程序中使用 DI 模式,请使用 IOptions 方法,在您的构造函数中只需请求 IOptions<OptionConfig>,否则您可以只注入 IConfiguration (Don't recommend)

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

当然,您会希望使用服务提供者输入您的第一个依赖项,以构建您的“应用程序依赖关系树”


编辑适合那些希望 .net 核心项目像旧(.net 框架)的配置一样工作的人。

如果您想使用 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 中那样工作。
  • @MasonWheeler 这个第三方依赖是用.netstandard写的吗?
  • @MasonWheeler 我添加了关于如何在 .net 核心中使用 ConfigurationManager 的替代方法。如果您的依赖项位于 .netframework 中,但您可能很难使用它,因为它可能与您的核心项目不兼容(尽管值得一试)
【解决方案3】:

我建议你可以使用System.Configuration.ConfigurationManager。 自 .NET Core 3.0 以来,此 ConfigurationManager.ConnectionStrings 是 .NET Core 桌面运行时的一部分(在 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];

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 2018-09-12
    • 2016-12-07
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多