【问题标题】:System.Configuration.Configuration an object reference is requiredSystem.Configuration.Configuration 需要对象引用
【发布时间】:2020-10-22 04:06:13
【问题描述】:

我正在为一个简单的问题而烦恼。我的 .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 是未知的,我无法从任何已知的扩展/库中导入它。查看建议,我可以看到 NuGet 包 System.Configuration.ConfigurationManager 可用。因此,我尝试安装它,看看它是否对我有帮助。不幸的是,在这样做之后,我从 Configuration 对象中收到以下错误:

非静态字段、方法或属性“Configuration.GetSection(string)”需要对象引用

根据我一直关注的指南以及我能够在线找到的其他文档,我不需要在任何地方实例化 Configuration 类。

那么,如何按照这种方法将我的配置注入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; }
    }
}

【问题讨论】:

    标签: c# .net-core dependency-injection configuration


    【解决方案1】:

    我将尝试根据您的 appsettings.json 文件和您的 ConfigurationProps 类使我所说的内容更易于阅读:

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

    using Microsoft.Extensions.Configuration;
    
        public IConfiguration Configuration { get; }
    

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

    将你的类修改为:

    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));
    }
    

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

    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 中的选项模式尝试执行的操作。

    【讨论】:

    • 看起来你已经明白了。至少这个答案会给下一个人一些额外的信息。
    【解决方案2】:

    我认为您提到的指南使用的是 .netcore 2.0。使用 .netcore 3.1,您只需在控制器的构造函数中包含“IConfiguration 配置”,然后您可以通过 configuration["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"]);
            }
        }
    }
    
    
    

    【讨论】:

      【解决方案3】:

      您正在尝试做的事情看起来很像选项模式。这里有一篇非常直截了当的文章:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1

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

      如果文章没有为你解决这个问题,你能发布你的模型和 appsettings.json 吗?

      【讨论】:

      • 我尝试按照指南进行操作,但出现了初始错误,Configuration 现在未知。我会将您要求的文件添加到我的原始帖子中。
      • 你的 startup.cs 文件中是否有这一行: public IConfiguration Configuration { get;这就是定义对象“配置”的内容,因此您可以使用它。您可能仍然需要摆脱那个 NuGet 包,以确保它也不会妨碍您。
      • 还必须在您的 startup.cs 文件中有此引用才能使用 IConfiguration: using Microsoft.Extensions.Configuration;
      • 做到了。由于某种原因,我没有将配置注入到我的启动文件中,并且指南认为它在那里。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2023-03-28
      • 2015-10-18
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      相关资源
      最近更新 更多