如何从 appsettings.json 获取价值
how to get value from appsettings.json
public class Bar
{
public static readonly string Foo = ConfigurationManager.AppSettings["Foo"];
}
在.NET Framework 4.x中,我可以使用ConfigurationManager.AppSettings ["Foo"]
获取Webconfig
中的Foo
,然后我可以轻松获取[=的值13=] 到 Bar.Foo
但是在.Net core中,我必须注入options
,并且无法通过Bar.Foo
获取Foo
的值
有没有一种方法,可以直接通过Bar.Foo
得到Foo
的值?
所以实际上有两种方法可以解决这个问题。
选项 1:选项 Class
您有一个 appsettings.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"));
}
然后在您的 controller/service 中注入 IOptions,它就可以使用了。
public class ValuesController : Controller
{
private readonly MyConfiguration _myConfiguration;
public ValuesController(IOptions<MyConfiguration> myConfiguration)
{
_myConfiguration = myConfiguration.Value;
}
}
就我个人而言,我不喜欢使用 IOptions,因为我认为它会带来一些我并不真正想要的额外垃圾,但您可以使用它来做一些很酷的事情,例如热交换和其他东西。
选项 2:配置 POCO
它大部分是相同的,但在您的 Configure Services 方法中,您改为绑定到您的 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/
您也可以直接使用configuration。您的设置已注入,因此您可以使用 DI 访问它们...
private readonly IConfiguration _configuration;
public MyClass(IConfiguration configuration)
{
_configuration = configuration;
}
然后您可以阅读您的设置...
在这种情况下,我要取回一个系列...
var myList = _configuration.GetSection("MyList").Get<List<string>>();
上面的解决方案既费时又不简单,这是最有效的方法,启动时不需要任何设置。这就像使用好的 ol Configuration.Manager.AppSettings["setting"]
首先创建一个 class 像 "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");
假设您的 appsettings.json 看起来像这样:
"Credential": {
"username": "myuser",
"password": "mypassword"
}
希望这对某人有所帮助。
将此添加到 AppSettings.json 文件
"Swagger": { "Title": "API DEVELOPMENT" }
然后在Startup.cs
文件中配置
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
接下来从appsettings.json
获取值
var title = Configuration.GetSection("Swagger:Title").Value;
终于放在这里
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = title, Version = "v1" }); }
来自@MindingData 的补充回答。我喜欢使用 Configuration.Bind(settings);
递归映射我的设置,这样我就不必在 ConfigureServices
.
中添加每个新部分
示例:
appsettings.json:
{
"MyConfiguration": {
"MyProperty": true
}
}
设置 class,属性必须匹配 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);
}
}
将您的class定义为
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"];
}
使用字典 属性。
尽情享受
public class Bar
{
public static readonly string Foo = ConfigurationManager.AppSettings["Foo"];
}
在.NET Framework 4.x中,我可以使用ConfigurationManager.AppSettings ["Foo"]
获取Webconfig
中的Foo
,然后我可以轻松获取[=的值13=] 到 Bar.Foo
但是在.Net core中,我必须注入options
,并且无法通过Bar.Foo
Foo
的值
有没有一种方法,可以直接通过Bar.Foo
得到Foo
的值?
所以实际上有两种方法可以解决这个问题。
选项 1:选项 Class
您有一个 appsettings.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"));
}
然后在您的 controller/service 中注入 IOptions,它就可以使用了。
public class ValuesController : Controller
{
private readonly MyConfiguration _myConfiguration;
public ValuesController(IOptions<MyConfiguration> myConfiguration)
{
_myConfiguration = myConfiguration.Value;
}
}
就我个人而言,我不喜欢使用 IOptions,因为我认为它会带来一些我并不真正想要的额外垃圾,但您可以使用它来做一些很酷的事情,例如热交换和其他东西。
选项 2:配置 POCO
它大部分是相同的,但在您的 Configure Services 方法中,您改为绑定到您的 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/
您也可以直接使用configuration。您的设置已注入,因此您可以使用 DI 访问它们...
private readonly IConfiguration _configuration;
public MyClass(IConfiguration configuration)
{
_configuration = configuration;
}
然后您可以阅读您的设置...
在这种情况下,我要取回一个系列...
var myList = _configuration.GetSection("MyList").Get<List<string>>();
上面的解决方案既费时又不简单,这是最有效的方法,启动时不需要任何设置。这就像使用好的 ol Configuration.Manager.AppSettings["setting"]
首先创建一个 class 像 "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");
假设您的 appsettings.json 看起来像这样:
"Credential": {
"username": "myuser",
"password": "mypassword"
}
希望这对某人有所帮助。
将此添加到 AppSettings.json 文件
"Swagger": { "Title": "API DEVELOPMENT" }
然后在
Startup.cs
文件中配置public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; }
接下来从
获取值appsettings.json
var title = Configuration.GetSection("Swagger:Title").Value;
终于放在这里
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = title, Version = "v1" }); }
来自@MindingData 的补充回答。我喜欢使用 Configuration.Bind(settings);
递归映射我的设置,这样我就不必在 ConfigureServices
.
示例:
appsettings.json:
{
"MyConfiguration": {
"MyProperty": true
}
}
设置 class,属性必须匹配 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);
}
}
将您的class定义为
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"];
}
使用字典 属性。
尽情享受