ASP.NET 5 (vNext) - 获取配置设置
ASP.NET 5 (vNext) - Getting a Configuration Setting
我正在编写一个基本的应用程序来学习 ASP.NET 5. 我发现 非常 令人困惑的一个领域是配置。在 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" 的值?
使用这个:
var value = Configuration.Get("AppSettings:SomeKey");
基于this blog post。冒号类似于点符号,用于在层次结构中向下导航。
如果您需要其他 类 中的值,您应该将其注入。ASP.NET 已内置依赖注入,但如果您只需要一个 MyClass 实例,则可以将其新建设置 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;
}
}
ASP.NET 5大量使用依赖注入,所以如果你也使用依赖注入那么这很简单。如果您检查示例 MVC6 项目,您可以看到它是如何工作的:
首先,属性中定义了一个 class AppSettings,它是 class 支持的选项的强类型版本。在示例项目中,这仅包含 SiteTitle。
public class AppSettings
{
public string SiteTitle { get; set; }
}
然后,这个class通过ConfigureServices中的依赖注入初始化。 Configuration
这是您在 Startup class 的构造函数中创建的那个。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));
// ...
}
然后,假设您的 class 是由依赖项注入容器实例化的,您只需请求一个 IOptions,您就会得到一个。例如,在控制器中,您可以具有以下内容:
public class HomeController
{
private string _title;
public HomeController(IOptions<AppSettings> settings)
{
_title = settings.Options.SiteTitle;
}
}
我强烈建议使用 OptionsModel
而不是直接读取配置。它允许强类型模型绑定到配置。
这里有一个例子:GitHub.com/aspnet/Options/test/Microsoft.Extensions.Options.Test/OptionsTest.cs
针对您的具体情况创建一个模型:
class AppSettings {
public string SomeSetting {get;set;}
}
然后将其绑定到您的配置:
var config = // The configuration object
var options = ConfigurationBinder.Bind<AppSettings>(config);
Console.WriteLine(options.SomeSetting);
这样您就不必担心设置的来源、存储方式或结构。您只需预定义您的期权模型,奇迹就会发生。
我用的是ASP.NET5依赖注入,像这样。
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");
}
}
我正在编写一个基本的应用程序来学习 ASP.NET 5. 我发现 非常 令人困惑的一个领域是配置。在 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.csMyClass.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" 的值?
使用这个:
var value = Configuration.Get("AppSettings:SomeKey");
基于this blog post。冒号类似于点符号,用于在层次结构中向下导航。
如果您需要其他 类 中的值,您应该将其注入。ASP.NET 已内置依赖注入,但如果您只需要一个 MyClass 实例,则可以将其新建设置 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;
}
}
ASP.NET 5大量使用依赖注入,所以如果你也使用依赖注入那么这很简单。如果您检查示例 MVC6 项目,您可以看到它是如何工作的:
首先,属性中定义了一个 class AppSettings,它是 class 支持的选项的强类型版本。在示例项目中,这仅包含 SiteTitle。
public class AppSettings
{
public string SiteTitle { get; set; }
}
然后,这个class通过ConfigureServices中的依赖注入初始化。 Configuration
这是您在 Startup class 的构造函数中创建的那个。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));
// ...
}
然后,假设您的 class 是由依赖项注入容器实例化的,您只需请求一个 IOptions,您就会得到一个。例如,在控制器中,您可以具有以下内容:
public class HomeController
{
private string _title;
public HomeController(IOptions<AppSettings> settings)
{
_title = settings.Options.SiteTitle;
}
}
我强烈建议使用 OptionsModel
而不是直接读取配置。它允许强类型模型绑定到配置。
这里有一个例子:GitHub.com/aspnet/Options/test/Microsoft.Extensions.Options.Test/OptionsTest.cs
针对您的具体情况创建一个模型:
class AppSettings {
public string SomeSetting {get;set;}
}
然后将其绑定到您的配置:
var config = // The configuration object
var options = ConfigurationBinder.Bind<AppSettings>(config);
Console.WriteLine(options.SomeSetting);
这样您就不必担心设置的来源、存储方式或结构。您只需预定义您的期权模型,奇迹就会发生。
我用的是ASP.NET5依赖注入,像这样。
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");
}
}