ASP.NET 5(vNext) – 获取configuration设置

我正在编写一个基本的应用程序来学习ASP.NET 5.我觉得混乱的一个领域是configuration。 在ASP.NET 5之前,我可以执行以下操作:

var settingValue = ConfigurationManager.AppSettings["SomeKey"]; 

我会有这样的代码行撒在我的代码。 现在,在vNext世界中,我有一个config.json文件,如下所示:

config.json

 { "AppSettings": { "SomeKey":"SomeValue" } } 

然后在Startup.cs中,我有以下: Startup.cs

 public IConfiguration Configuration { get; set; } public Startup(IHostingEnvironment environment) { Configuration = new Configuration() .AddJsonFile("config.json"); } 

从那里,我完全难倒了。 我在/src/Website/Code/Models/MyClass.cs中有MyClass.cs。

MyClass.cs

 public class MyClass { public string DoSomething() { var result = string.Empty; var keyValue = string.Empty; // TODO: What do I do here? How do I get the value of "AppSettings:SomeKey"? return result; } } 

我如何获得“AppSettings:SomeKey”的价值?

我强烈build议使用OptionsModel而不是直接读取configuration。 它允许强types模型绑定到configuration。

这里是一个例子: GitHub.com/aspnet/Options/test/Microsoft.Extensions.Options.Test/OptionsTest.cs

为您的具体情况创build一个模型:

 class AppSettings { public string SomeSetting {get;set;} } 

然后将其绑定到您的configuration:

 var config = // The configuration object var options = ConfigurationBinder.Bind<AppSettings>(config); Console.WriteLine(options.SomeSetting); 

这样你就不用担心设置的来源,存储方式或结构。 你只是预先定义你的select模型和魔术发生。

ASP.NET 5大量使用dependency injection,所以如果您也使用dependency injection,那么这非常简单。 如果您查看示例MVC6项目,您可以看到这是如何工作的:

首先,在属性中定义了一个类AppSettings,这是您的类支持的选项的强types版本。 在示例项目中,这只包含SiteTitle。

 public class AppSettings { public string SiteTitle { get; set; } } 

然后,这个类在ConfigureServices中通过dependency injection来初始化。 这里的Configuration是你在Startup类的构造函数中创build的。

 public void ConfigureServices(IServiceCollection services) { services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings")); // ... } 

然后,假设你的类被dependency injection容器实例化,你可以简单地要求一个IOptions,你会得到一个。 例如,在控制器中,您可以具有以下内容:

 public class HomeController { private string _title; public HomeController(IOptions<AppSettings> settings) { _title = settings.Options.SiteTitle; } } 

我使用ASP.NET 5dependency injection,就像这样。

config.json:

 { "random": "Hello World!" } 

startup.cs:

 public class Startup { public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv) { var builder = new ConfigurationBuilder(appEnv.ApplicationBasePath) .AddJsonFile("config.json"); Configuration = builder.Build(); } public IConfiguration Configuration { get; set; } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSingleton<IConfiguration>(sp => { return Configuration; }); } public void Configure(IApplicationBuilder app) { app.UseMvc(routes => { routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } } 

控制器:

 public class HomeController : Controller { IConfiguration config; public HomeController(IConfiguration config) { this.config = config; } public IActionResult Index() { var template = "<marquee>{0}</marquee>"; var content = string.Format(template, config.Get("random")); return Content(content, "text/html"); } } 

用这个:

 var value = Configuration.Get("AppSettings:SomeKey"); 

基于这个博客文章 。 冒号与点符号类似,用于在层次结构中进行导航。

如果你需要在其他类中的值,你应该注入它。ASP.NET已经build立了dependency injection,但是如果你只需要一个MyClass的实例,你可以创build它,而不是build立一个DI容器。

 public IConfiguration Configuration { get; set; } public Startup(IHostingEnvironment environment) { Configuration = new Configuration() .AddJsonFile("config.json"); //generally here you'd set up your DI container. But for now we'll just new it up MyClass c = new MyClass(Configuration.Get("AppSettings:SomeKey")); } public class MyClass { private readonly string Setting; //if you need to pass multiple objects, use a custom POCO (and interface) instead of a string. public MyClass(string setting) //This is called constructor injection { Setting = setting; } public string DoSomething() { var result = string.Empty; //Use setting here return result; } }