System.Configuration.Configuration 需要对象引用

System.Configuration.Configuration an object reference is required

我正为一个简单的问题而焦头烂额。我的 .NET Core 3 应用程序中有一些设置,我认为最好将其移至我的 appsettings.json 文件。我按照本指南这样做:https://www.c-sharpcorner.com/article/reading-values-from-appsettings-json-in-asp-net-core/

在指南的下方,有一节是关于如何依赖注入部分配置的,我认为遵循该节是个好主意。它说在 ConfigureServices 方法中将以下代码添加到我的 Startup.cs 文件中。

services.Configure<ConfigurationProps>(Configuration.GetSection("ApplicationConfiguration"));

当我这样做时,起初 Configuration 是未知的,我无法从任何已知的 extension/library 导入它。查看建议,我可以看到 NuGet 包 System.Configuration.ConfigurationManager 可用。因此,我尝试安装它以查看它是否对我有帮助。不幸的是,这样做之后,我从 Configuration 对象中收到以下错误:

An object reference is required for the non-static-field, method, or property 'Configuration.GetSection(string)'

根据我一直遵循的指南以及我能够在网上找到的其他文档,我不需要在任何地方实例化配置 class。

那么,如何按照这种方法将我的配置注入 services.Configure 方法?

编辑:已添加文件

appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ApplicationConfiguration": {
    "StartingPort": 13000,
    "NumberOfConnections": 1
  }
}

配置道具:

namespace ExternalGateway.Models
{
    public class ConfigurationProps
    {
        public int StartingPort { get; set; }
        public int NumberOfConnections { get; set; }
    }
}

您尝试执行的操作看起来很像选项模式。这里有一篇非常直接的文章:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1

您不需要 NuGet 包即可使用它。您只需更改 Configuration.GetSection 语句并确保 appsettings.json 和“MySettingsModel”的结构正确。

如果本文没有为您解决这个问题,您可以 post 您的模型和 appsettings.json 吗?

我将尝试根据您的 appsettings.json 文件和您的 ConfigurationProps class:

使我所说的更容易阅读

在您的 startup.cs 文件中,确保您有:

using Microsoft.Extensions.Configuration;

    public IConfiguration Configuration { get; }

在您的 startup.cs 文件中。没有它,Configuration.GetSection 是未知的。

将您的 class 修改为:

namespace ExternalGateway.Models
    {
        public class ConfigurationProps
        {
            public const string ConfigurationProps = "ApplicationConfiguration";

            public int StartingPort { get; set; }
            public int NumberOfConnections { get; set; }
        }
    }

然后您在 startup.cs 中获取配置的行将如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<ConfigurationProps>(Configuration.GetSection(ConfigurationProps.ApplicationConfiguration));
}

然后你的依赖注入到你的 class 看起来像这样:

using Microsoft.Extensions.Options;

    public class MyClass
    {
        private readonly int _startingPort;
        private readonly int _numberOfConnections;

        public MyClass(IOptions<ConfigurationProps> configurationProps)
        {
            _startingPort = configurationProps.Value.StartingPort;
            _numberOfConnections = configurationProps.Value.NumberOfConnections;
        }

除非此处有任何拼写错误,否则这应该可以完成您使用 .NET Core 中的选项模式尝试执行的操作。

我认为您提到的指南使用的是.netcore 2.0。使用.netcore 3.1,你只需要在控制器的构造函数中包含“IConfiguration配置”,然后你就可以通过配置[“ApplicationConfiguration:StartingPort”]访问你的appSettings.json,如下例:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;


namespace ConfigTest.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class YourController : ControllerBase
    {        
        private readonly IConfiguration _configuration;

        public YourController(IConfiguration configuration)
        {
            _configuration = configuration;           
        }

        [HttpGet]
        public ActionResult Get()
        {
            return Ok(_configuration["ApplicationConfiguration:StartingPort"]);
        }
    }
}