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"]);
}
}
}
我正为一个简单的问题而焦头烂额。我的 .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"]);
}
}
}