how to get value from appsettings.json

public class Bar
{
public static readonly string Foo = ConfigurationManager.AppSettings["Foo"];
}

In the .NET Framework 4.x, I can use the ConfigurationManager.AppSettings ["Foo"] to get Foo in Webconfig,and then I can easily get the value of Foo through Bar.Foo

But in .Net core, I mustto inject options, And can not get the value of Foothrough Bar.Foo

Is there a method, which can be directly through the Bar.Foo to get the value of Foo?

147534 次浏览

所以实际上有两种方法来解决这个问题。

选项1: 选项类

您有一个 appsetings.json 文件:

{
"myConfiguration": {
"myProperty": true
}
}

您创建一个如下的配置 POCO:

public class MyConfiguration
{
public bool MyProperty { get; set; }
}

在 startup.cs 中,ConfigureServices 中有注册配置的内容:

public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyConfiguration>(Configuration.GetSection("myConfiguration"));
}

然后在控制器/服务中注入 IOptions,它就可以使用了。

public class ValuesController : Controller
{
private readonly MyConfiguration _myConfiguration;


public ValuesController(IOptions<MyConfiguration> myConfiguration)
{
_myConfiguration = myConfiguration.Value;
}
}

就个人而言,我不喜欢使用 IOptions,因为我认为它会拖累一些我并不真正想要的额外垃圾,但是你可以用它来做一些很酷的事情,比如热交换之类的。

备选方案2: 配置 POCO

它大致相同,但是在 ConfigureServices 方法中,您可以绑定到 POCO 的单个实例。

public void ConfigureServices(IServiceCollection services)
{
//services.Configure<MyConfiguration>(Configuration.GetSection("myConfiguration"));
services.AddSingleton(Configuration.GetSection("myConfiguration").Get<MyConfiguration>());
}

然后你可以直接注射 POCO:

public class ValuesController : Controller
{
private readonly MyConfiguration _myConfiguration;


public ValuesController(MyConfiguration myConfiguration)
{
_myConfiguration = myConfiguration;
}
}

有点过于简单,因为您可能应该使用一个接口来使单元测试更容易一些,但是您已经明白了这个想法。

大部分是从这里拍的: http://dotnetcoretutorials.com/2016/12/26/custom-configuration-sections-asp-net-core/

您也可以直接使用 配置。您的设置被注入,所以您可以得到他们与 DI..。

private readonly IConfiguration _configuration;


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

然后你就可以读取你的设置。

在这种情况下,我得到一个收集回来..。

var myList = _configuration.GetSection("MyList").Get<List<string>>();

上面的解决方案是耗费时间和不直接,这是最有效的方式做到这一点,没有设置需要启动或任何东西。这就像使用很好的 ol 配置。经理。应用程序设置[“设置”]

首先创建一个类似“ Credential”的类:

public class Credential
{
public string Username {get;set}
public string Password {get;set;}
}

现在设置好了,让我们把 IConfiguration 放在构造函数上,就像这样:

    private IConfiguration _configuration;
public ValuesController(IConfiguration iconfig)
{
_configuration = iconfig;
}

那你就可以宣布死亡了!

    Credential c = new Credential();
c.UserName = _configuration.GetValue<string>("Credential:username");
c.Password = _configuration.GetValue<string>("Credential:password");

假设你的 appsetings.json 是这样的:

"Credential": {
"username": "myuser",
"password": "mypassword"
}

希望这对谁有帮助。

  1. 将其添加到 AppSettings.json 文件中
    "Swagger": { "Title": "API DEVELOPMENT" }

  2. 然后在 Startup.cs文件中配置它

    public Startup(IConfiguration configuration)
    {
    Configuration = configuration;
    }
    
    
    public IConfiguration Configuration { get; }
    
  3. 接下来从 appsettings.json获取值

    var title = Configuration.GetSection("Swagger:Title").Value;
    
  4. 终于放在这儿了

    services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = title, Version = "v1" }); }
    

从@MindingData 添加回答。我喜欢使用 Configuration.Bind(settings);递归地映射我的设置,这样我就不必在 ConfigureServices中添加每个新的部分。

例如:

Appsettings.json:

{
"MyConfiguration": {
"MyProperty": true
}
}

设置类,属性必须匹配 appsettings.json名称:

public class Settings
{


public MyConfigurationSettings MyConfiguration { get; set; }


public class MyConfigurationSettings
{
public bool MyProperty { get; set; }
}


}

Startup.cs

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}


public IConfiguration Configuration { get; }


// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{


var settings = new Settings();
Configuration.Bind(settings);
services.AddSingleton(settings);
...

可以在这样的控制器中使用:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly Settings _settings;


public ValuesController(Settings settings)
{
_settings = settings;
}


[HttpGet("GetValue")]
public ActionResult<string> Get()
{
return Ok(_settings.MyConfiguration.MyProperty);
}
}

将类定义为

public class MyClass{
private readonly IConfiguration _configuration;
public MyClass(IConfiguration configuration)
{
_configuration = configuration;
}
public void myFunction(){
var value= _configuration.GetValue("xxx");
}
}

当你从任何地方呼唤它的时候

IConfiguration config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false).Build();
MyClass myclass = new MyClass(config)

如果您已经传递给控制器您的配置,并且不想在启动配置中映射另一个服务,您可以通过这种方式轻松地从配置中获得您的值:

public Startup(IConfiguration configuration)
{
Configuration = configuration;
  

var myProperty = _configuration.GetSection("MyConfiguration")["MyProperty"];
}

使用字典属性。

好好享受吧

冥想数据的顶级答案是伟大的。我只是想补充一点,建议使用 IOptions,因为这样您就可以处理配置更改和必须重新加载的情况。

对于这种情况,我建议使用 IOptionsMonitor,它创建一个单例来存储配置对象,当 appsettings.json发生变化时,您的对象将自动更新。
您甚至可以将侦听器注册到 IOptionsMonitorOnChange()方法并进一步对更改作出反应。

在生产环境中有服务时,使用这种方法可以使您获得优势,无需重新启动服务来加载新配置。