从 asp.net 核心 3.1 中的 App.config 文件获取数据
get data from App.config file in asp.net core 3.1
我在我的一个项目中安装了 System.Configuration.ConfigurationManager -Version 4.7.0 作为 class 库项目,然后我在其中添加了 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>
解决方案
要解决您的问题,请将 App.config 文件添加到 ENTRY POINT 项目。
这是您的可执行项目,例如 WinForms 或 WPF 或 Console App。
不是 Class 库项目。
原因是当应用程序编译时 App.config 被重命名为 "MyProjectName.Ext.config"。
例如,如果您有 Class 名为 ConfigUtils 的库项目,文件将输出为 ConfigUtils.dll.config。
但 ConfigurationManager 需要入口点的名称加上配置。
因此,如果您的 ConfigUtils 是从 MyApp 控制台项目中引用的。然后输出文件将是 MyApp.exe.config
因此,要让 ConfigurationManager 立即运行而无需任何进一步干预,您需要将 App.config 文件放在入口点项目中。
.NET 核心方式
我建议不要使用 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文件,设置为"Copy Always"。
要使所有这些正常工作,您需要像这样添加 2 个 NuGet 包:
备注:
您可以使用其他 "Providers" 从 XML、INI 和其他类型的文件和源中提取配置。为此,您需要添加其他 NuGet 包等。
这个 link 尽管它谈论 ASP.NET Core Configuration 但它非常有用,因为同样的概念适用。
我在我的一个项目中安装了 System.Configuration.ConfigurationManager -Version 4.7.0 作为 class 库项目,然后我在其中添加了 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>
解决方案
要解决您的问题,请将 App.config 文件添加到 ENTRY POINT 项目。
这是您的可执行项目,例如 WinForms 或 WPF 或 Console App。
不是 Class 库项目。
原因是当应用程序编译时 App.config 被重命名为 "MyProjectName.Ext.config"。
例如,如果您有 Class 名为 ConfigUtils 的库项目,文件将输出为 ConfigUtils.dll.config。
但 ConfigurationManager 需要入口点的名称加上配置。
因此,如果您的 ConfigUtils 是从 MyApp 控制台项目中引用的。然后输出文件将是 MyApp.exe.config
因此,要让 ConfigurationManager 立即运行而无需任何进一步干预,您需要将 App.config 文件放在入口点项目中。
.NET 核心方式 我建议不要使用 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文件,设置为"Copy Always"。
要使所有这些正常工作,您需要像这样添加 2 个 NuGet 包:
备注: 您可以使用其他 "Providers" 从 XML、INI 和其他类型的文件和源中提取配置。为此,您需要添加其他 NuGet 包等。
这个 link 尽管它谈论 ASP.NET Core Configuration 但它非常有用,因为同样的概念适用。