这个问题经历了一些曲折。我已经修改了这个答案,使其与ASP.NET Core 2.0保持最新状态(截至2018年2月26日)。
这主要来自官方文档:
要在ASP.NET应用程序中使用设置,建议您只在应用程序的Startup
类中实例化一个Configuration
,然后使用选项模式访问单个设置。假设我们有一个类似于appsettings.json
的文件,如下所示:
{
"MyConfig": {
"ApplicationName": "MyApp",
"Version": "1.0.0"
}
}
我们有一个代表配置的POCO对象:
public class MyConfig
{
public string ApplicationName { get; set; }
public int Version { get; set; }
}
现在我们在Startup.cs
中构建配置:
public class Startup
{
public IConfigurationRoot Configuration { get; set; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
Configuration = builder.Build();
}
}
注意,在.NET Core 2.0中,默认情况下将注册appsettings.json
。如果需要,我们还可以针对每个环境注册一个appsettings.{Environment}.json
配置文件。
如果我们想将配置注入到控制器中,我们需要在运行时中注册它。我们可以通过Startup.ConfigureServices
来实现:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddOptions();
services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
}
我们这样进行注入:
public class HomeController : Controller
{
private readonly IOptions<MyConfig> config;
public HomeController(IOptions<MyConfig> config)
{
this.config = config;
}
public IActionResult Index() => View(config.Value);
}
完整的Startup
类:
public class Startup
{
public IConfigurationRoot Configuration { get; set; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddOptions();
services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
}
}