在ASP.NET Core 3.1中从App.config文件获取数据

4

我在我的一个类库项目中安装了System.Configuration.ConfigurationManager -Version 4.7.0,然后添加了app.config文件。

我在我的项目中使用了ASP.NET Core 3.1。

现在我想要获取这个部分的值。

为此,我像这样做:

namespace Alpha.Infrastructure.PaginationUtility
{
   public class PagingInfo
   {
       public virtual int DefaultItemsPerPage { get; set; } = int.Parse(System.Configuration.ConfigurationManager.AppSettings["DefaultItemsPerPage"]);
   }
}

但我遇到了“ArgumentNullException:值不能为 null”的错误!

我该如何解决这个问题?

App.config 文件:

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

1
这并不是.NET Core中的正确做法... 在.NET Core中,您需要使用appsettings.json。而且还有一个从json文件读取配置的功能。 - Jonathan Alfaro
正如所说的那样,您可能想要查看 net core 的新配置选项。但您仍然可以使用 ConfigurationManager。您确定您的 app.config 正在复制到您的 bin 文件夹中吗? - ESG
1
当你的应用程序配置文件(App.config)被重命名为类似“MyDLL.dll.config”的文件时,实际上它期望的是“MyEntryApp.exe.config”。 - Jonathan Alfaro
顺便说一下,我在如何在.NET Core中完成这项工作方面添加了一个答案……如果您的应用程序是Web应用程序,则有所不同,但我也添加了链接。 - Jonathan Alfaro
我还添加了一个“修复”来解决您的问题,使用ConfigurationManager。虽然我建议您使用.NET Core的方式。 - Jonathan Alfaro
1个回答

8
解决方案 要解决问题,请将App.config文件添加到入口点项目中。
这是你的可执行项目,例如WinForms、WPF或控制台应用程序。
不要添加到类库项目中。

原因是当应用程序编译时,App.config会被重命名为"MyProjectName.Ext.config"。

例如,如果你有一个名为ConfigUtils的类库项目,则文件将输出为ConfigUtils.dll.config。

但是ConfigurationManager期望入口点名称加上config。

所以,如果你的ConfigUtils被MyApp控制台项目引用。然后输出文件将是MyApp.exe.config。

因此,为了让ConfigurationManager正常工作而无需进行任何进一步的干预,你需要将App.config文件放在入口点项目中。

.NET CORE方式 我建议不要使用ConfigurationManager...

只需使用新的方法!

为了演示如何在.NET Core中完成它,我创建了一个使用.NET Core 3.1.3的控制台应用程序。 我还添加了一个扩展方法来包装可重用性功能。

首先是我的代码:

    using Microsoft.Extensions.Configuration;
    using System;

    class Program
    {
        private static IConfiguration _configuration;
        static void Main(string[] args)
        {
            _configuration = new ConfigurationBuilder()
          .AddJsonFile("appsettings.json", true, true)
          .Build();

            var itemsPerPage = _configuration.GetValue<int>("appSettings", "DefaultItemsPerPage");
            Console.WriteLine("Items Per Page:" + itemsPerPage.ToString());
            Console.ReadLine();
        }
    }
    public static class ConfigExtenstions
    {
        public static T GetValue<T>(this IConfiguration configuration, string configSection, string keyName)
        {
            return (T)Convert.ChangeType(configuration[$"{configSection}:{keyName}"], typeof(T));
        }
        private static T GetValue<T>(string configSection, string configSubSection, string keyName)
        {
            return (T)Convert.ChangeType(Configuration[$"{configSection}:{configSubSection}:{keyName}"], typeof(T));
        }
    }

我的 appsettings.json 文件如下所示:

{
  "appSettings": {
    "DefaultItemsPerPage": 3
  }
}

配置文件可以按照您的需求进行建模。在这种情况下,我让它看起来像您的app.config文件。
此外,我在Visual Studio中右键单击了appsettings.json文件,并设置为“始终复制”。
为了使所有这些工作正常,您需要添加2个NuGet包,如下所示:

enter image description here

注意: 您可以使用其他“提供程序”从XML、INI和其他类型的文件和源中获取配置。为此,您需要添加其他NuGet包等。

即使这个链接谈论ASP.NET Core Configuration,但它非常有用,因为相同的概念适用。


这里我们需要向类库添加配置,而不是入口点。该类库可以在任何类型的项目中使用。 - NitinSingh
@NitinSingh,你仍然需要将配置添加到入口点中...或者从类库动态加载它...问题将是与依赖注入框架的冲突...特别是如果它将IConfigurationRoot作为单例传递。 - Jonathan Alfaro

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