C#在.NET Core中的ConfigurationManager

7

我有一个共享的.NET Standard库,最初被.NET 4.8 MVC 4项目引用。这个共享库中有很多代码使用ConfigurationManager,例如:

var sze = ConfigurationManager.AppSettings["MaxAttachmentSize"];

这个MaxAttachmentSize的值(和其他一些值)之前是存储在web.config文件中的。

现在我正在构建一个.NET 6项目,该项目将使用同一个共享项目,我需要找到一种方法让这些配置应用程序设置在新的.NET Core应用程序中起作用。有什么最好的方法可以做到这一点吗?

我的问题是:

  • 是否有一种方法可以让ConfigurationManager从.NET Core的appsettings.json文件中读取数据,就像它在ASP.NET MVC 4项目中从web.config中读取数据一样?
  • 如果没有,是否有另一种配置读取器可供使用,可以为我需要的两个项目都发挥作用?

然而,存在一个大问题,就是所有对ConfigurationManger的调用都是静态的,因此,如果.NET Core选项也可以是静态的,那将非常有帮助。如果不行,那么将需要更多的工作来使ASP.NET MVC 4项目可用于依赖注入。

3个回答

9

现在,您可以更轻松地获得它。

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

string sze = Configuration.GetSection("AppSettings:MaxAttachmentSize").Value;

在添加到appsettings.json后

  "AppSettings": {
    "MaxAttachmentSize": "size1",
    "MinAttachmentSize": "size2"
  }

1
你在上面的代码中使用了哪个包?是 System.Configuration.ConfigurationManager 吗?如果是,则我会收到一个 Configuration.GetSection 需要对象引用才能工作的错误。如果您说的是 Microsoft.Extensions.Configuration,那也不行,因为它还需要 IConfiguration 的实例化。 - Phil
这取决于您正在尝试获取 appsettings.json 数据的代码位置。此代码将在启动或(net6 程序)中工作。如果您尝试在另一个地方获取数据,则必须注入 IConfiguration。 - Serge
是的,这就是问题所在。.NET Framework中的ConfigurationManager是一个静态方法,而我的共享项目正在使用它。理想情况下,我将找到另一种获取appsettings.json变量的静态方式。 - Phil
@Phil 我知道的唯一静态方法是创建一个全局静态变量。从启动内部,您可以分配值甚至整个配置内容。最常见的方法是使用配置的依赖注入或注入特殊服务。 - Serge

3

使用ASP .NET6

安装NuGet包System.Configuration.ConfigurationManager

我的配置文件名为App.Config

App.config的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <appSettings>
        <add key="DBConnectionString" value="aa" />
        <add key="DBName" value="bb" />
        <add key="AuthKey" value="cc" />
    </appSettings>
</configuration>

文件读取值,例如SettingsService.cs:

using namespc = System.Configuration;

namespace Ecommerce_server.Services.SetupOperation
{
    public interface ISettingsService
    {
        string MongoDBConnectionString { get => namespc.ConfigurationManager.AppSettings["DBConnectionString"]!; }

        string DataBaseName { get => namespc.ConfigurationManager.AppSettings["DBName"]!; }

        public string AuthKey { get => namespc.ConfigurationManager.AppSettings["AuthKey"]!; }

    }

    public class SettingsService : ISettingsService
    {
        public string MongoDBConnectionString { get => namespc.ConfigurationManager.AppSettings["DBConnectionString"]!; }

        public string DataBaseName { get => namespc.ConfigurationManager.AppSettings["DBName"]!; }

        public string AuthKey { get => namespc.ConfigurationManager.AppSettings["AuthKey"]!; }

    }
}

注意:我们不得不为 ConfigurationManger 创建一个专用的命名空间以解决歧义。

这与 .NET 6 中的设置层次结构交互如何?在该结构中,值是根据定义位置覆盖的。例如,环境变量将覆盖 appsettings.json 中的值。这是否也适用于 App.config? - Chaulky
配置系统优先使用appsettings.json文件而不是App.config文件。 appsettings.json文件中的值将优先,任何在App.config文件中定义的值都将被忽略。虽然您可以同时使用两者,但不应在两个文件中使用相同的设置,否则它将无法工作并且会造成代码重复。因此,如果您不在两个文件中使用相同的设置,则不必担心哪个会覆盖另一个。 - Franco

3

Serge 给出的回复是正确的。建议在 .Net 6 及以上版本中使用 appsettings.json 替代 App.Config,并使用 Microsoft.Extensions.Configurations namespace 而不是 System.Configuraiton.ConfigurationManager这里 是 Microsoft 的说明。

在根目录下创建一个 appsettings.json 文件,内容如下:

 "AppSettings": {
    "MaxAttachmentSize": "size1",
    "MinAttachmentSize": "size2"
  }

在 App.xaml.cs 中获取 IConfiguration 实例。
using System.Windows;
using Microsoft.Extensions.Configuration;

namespace WebSiteRatings
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public static IConfiguration Config { get; private set; }

        public App()
        {
            Config = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json")
                .Build();
        }
    }
}

您可以按照以下方式在应用程序内访问

string size = App.Config.GetSection("AppSettings:MaxAttachmentSize").Value;

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