我正在为一个简单的问题而扯头发。我的 .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.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; }
}
}
我将尝试根据您的appsettings.json文件和ConfigurationProps类使我所说的内容更容易阅读:
在 startup.cs 文件中,确保您具有:
using Microsoft.Extensions.Configuration;
public IConfiguration Configuration { get; }
在您的启动.cs文件中。没有它,Configuration.GetSection 是未知的。
将类修改为:
namespace ExternalGateway.Models
{
public class ConfigurationProps
{
public const string ConfigurationProps = "ApplicationConfiguration";
public int StartingPort { get; set; }
public int NumberOfConnections { get; set; }
}
}
然后你在启动.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 中的选项模式执行的操作。
您尝试执行的操作看起来很像选项模式。这里有一篇非常直接的文章:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1
不需要 NuGet 包即可使用它。 你只需要更改你的Configuration.GetSection语句,并确保你的appsettings.json和你的"MySettingsModel"结构正确。
如果文章没有为您解决此问题,您可以发布您的模型和appsettings.json吗?
我认为您提到的指南使用的是.netcore 2.0。在 .netcore 3.1 中,您只需要在控制器的构造函数中包含"IConfiguration configuration",然后就可以通过 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"]);
}
}
}