我不确定这里遗漏了什么,但我无法从.net核心应用程序中的appsettings.json获取值。我的appsettings.json是这样的:
{
"AppSettings": {
"Version": "One"
}
}
启动:
public class Startup
{
private IConfigurationRoot _configuration;
public Startup(IHostingEnvironment env)
{
_configuration = new ConfigurationBuilder()
}
public void ConfigureServices(IServiceCollection services)
{
//Here I setup to read appsettings
services.Configure(_configuration.GetSection("AppSettings"));
}
}
型号:
public class AppSettings
{
public string Version{ get; set; }
}
控制器:
public class HomeController : Controller
{
private readonly AppSettings _mySettings;
public HomeController(IOptions settings)
{
//This is always null
_mySettings = settings.Value;
}
}
始终为空。我是不是漏掉了什么?
发布于 2017-10-26 03:40:07
Program和Startup类
.NET核心2.x
你不需要新的
在
构造函数。它的实现将由DI系统注入。
// Program.cs
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
.Build();
}
// Startup.cs
public class Startup
{
public IHostingEnvironment HostingEnvironment { get; private set; }
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
this.HostingEnvironment = env;
this.Configuration = configuration;
}
}
.NET核心1.x
你需要告诉我
若要加载appsettings文件,请执行以下操作。
// Program.cs
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup()
.UseApplicationInsights()
.Build();
host.Run();
}
}
//Startup.cs
public class Startup
{
public IConfigurationRoot Configuration { get; private set; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}
...
}
获取值
有许多方法可以从应用程序设置中获取您配置的值:
简单的使用方法
使用
选项模式
让我们说你的
如下所示:
{
"ConnectionStrings": {
...
},
"AppIdentitySettings": {
"User": {
"RequireUniqueEmail": true
},
"Password": {
"RequiredLength": 6,
"RequireLowercase": true,
"RequireUppercase": true,
"RequireDigit": true,
"RequireNonAlphanumeric": true
},
"Lockout": {
"AllowedForNewUsers": true,
"DefaultLockoutTimeSpanInMins": 30,
"MaxFailedAccessAttempts": 5
}
},
"Recaptcha": {
...
},
...
}
简单的方法
您可以将整个配置注入到您的控制器/类的构造函数中(通过
),并使用指定的key获取您想要的值:
public class AccountController : Controller
{
private readonly IConfiguration _config;
public AccountController(IConfiguration config)
{
_config = config;
}
[AllowAnonymous]
public IActionResult ResetPassword(int userId, string code)
{
var vm = new ResetPasswordViewModel
{
PasswordRequiredLength = _config.GetValue(
"AppIdentitySettings:Password:RequiredLength"),
RequireUppercase = _config.GetValue(
"AppIdentitySettings:Password:RequireUppercase")
};
return View(vm);
}
}
选项模式
The The The
如果您只需要应用程序设置中的一个或两个值,则效果很好。但是,如果您想要从应用程序设置中获取多个值,或者您不想在多个位置对这些关键字符串进行硬编码,那么它可能更易于使用
选项模式
..。选项模式使用类来表示层次结构/结构。
要使用选项模式,请执行以下操作:
定义表示结构的类
注册这些类绑定到的配置实例
注入
放入要获取值的控制器/类的构造函数中
1.定义表示结构的配置类
您可以定义具有以下属性的类
需要完全匹配
应用程序设置中的密钥。类的名称不必与应用程序设置中的节的名称匹配:
public class AppIdentitySettings
{
public UserSettings User { get; set; }
public PasswordSettings Password { get; set; }
public LockoutSettings Lockout { get; set; }
}
public class UserSettings
{
public bool RequireUniqueEmail { get; set; }
}
public class PasswordSettings
{
public int RequiredLength { get; set; }
public bool RequireLowercase { get; set; }
public bool RequireUppercase { get; set; }
public bool RequireDigit { get; set; }
public bool RequireNonAlphanumeric { get; set; }
}
public class LockoutSettings
{
public bool AllowedForNewUsers { get; set; }
public int DefaultLockoutTimeSpanInMins { get; set; }
public int MaxFailedAccessAttempts { get; set; }
}
2.注册配置实例
然后,您需要将此配置实例注册到
在启动过程中:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
...
namespace DL.SO.UI.Web
{
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
...
var identitySettingsSection =
_configuration.GetSection("AppIdentitySettings");
services.Configure(identitySettingsSection);
...
}
...
}
}
3.注入IOptions
最后,在要获取值的控制器/类上,需要注入
通过构造函数:
public class AccountController : Controller
{
private readonly AppIdentitySettings _appIdentitySettings;
public AccountController(IOptions appIdentitySettingsAccessor)
{
_appIdentitySettings = appIdentitySettingsAccessor.Value;
}
[AllowAnonymous]
public IActionResult ResetPassword(int userId, string code)
{
var vm = new ResetPasswordViewModel
{
PasswordRequiredLength = _appIdentitySettings.Password.RequiredLength,
RequireUppercase = _appIdentitySettings.Password.RequireUppercase
};
return View(vm);
}
}
发布于 2018-08-10 14:59:42
只需创建一个AnyName.cs文件并粘贴以下代码即可。
using System;
using System.IO;
using Microsoft.Extensions.Configuration;
namespace Custom
{
static class ConfigurationManager
{
public static IConfiguration AppSetting { get; }
static ConfigurationManager()
{
AppSetting = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("YouAppSettingFile.json")
.Build();
}
}
}
必须将YouAppSettingFile.json文件名替换为您的文件名。
您的.json文件应该如下所示。
{
"GrandParent_Key" : {
"Parent_Key" : {
"Child_Key" : "value1"
}
},
"Parent_Key" : {
"Child_Key" : "value2"
},
"Child_Key" : "value3"
}
现在你可以使用它了。
别忘了
添加引用
在你想要使用的类中。
using Custom;
检索值的代码。
string value1 = ConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];
string value2 = ConfigurationManager.AppSetting["Parent_Key:Child_Key"];
string value3 = ConfigurationManager.AppSetting["Child_Key"];
发布于 2018-02-22 19:12:16
除了大卫·梁对以下问题的回答
核心2.0
-
链接到的文件
变量。
可以设置为任何值,但框架支持三个值:
,以及
..。如果
未设置,则默认为
..。
对于这三个值,
appsettings.ASPNETCORE
_
ENVIRONMENT.json
支持开箱即用的文件-
和
以上三个应用程序设置json文件可用于配置多个环境。
示例:
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"System": "Information",
"Microsoft": "Information"
}
},
"MyConfig": "My Config Value for staging."
}
使用
检索任何配置值。
public class Startup
{
public Startup(IHostingEnvironment env, IConfiguration config)
{
Environment = env;
Configuration = config;
var myconfig = Configuration["MyConfig"];
}
public IConfiguration Configuration { get; }
public IHostingEnvironment Environment { get; }
}
https://stackoverflow.com/questions/46940710
复制相似问题