我正在尝试学习ASP.NET 5.我在Mac OS X上使用它.此时,我有一个如下所示的config.json文件:
config.json
{
"AppSettings": {
"Environment":"dev"
},
"DbSettings": {
"AppConnectionString": "..."
},
"EmailSettings": {
"EmailApiKey": "..."
},
}
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚如何将这些设置加载到Startup.cs中的配置文件中.目前,我有一个看起来像这样的文件:
Configuration.cs
public class AppConfiguration
{
public AppSettings AppSettings { get; set; }
public DbSettings DbSettings { get; set; }
public EmailSettings EmailSettings { get; set; }
}
public class AppSettings
{
public string Environment { get; set; }
}
public class DbSettings
{
public string AppConnectionString { get; set; }
}
public class EmailSettings
{
public string MandrillApiKey { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,在Startup.cs中,我有以下内容:
public IConfiguration Configuration { get; set; }
public Startup(IHostingEnvironment environment)
{
var configuration = new Configuration().AddJsonFile("config.json");
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppConfiguration>(Configuration);
}
Run Code Online (Sandbox Code Playgroud)
但是,这种方法不起作用.基本上,它就像它不知道如何在.json和Config类之间映射.我该怎么做呢?
我真的很想继续使用DI方法,这样我就可以更有效地测试我的应用程序.
谢谢
在您的Startup班级中,首先指定您的配置源:
private readonly IConfiguration configuration;
public Startup(IHostingEnvironment env)
{
configuration = new Configuration()
.AddJsonFile("config.json")
.AddJsonFile($"config.{env.EnvironmentName}.json", optional: true);
}
Run Code Online (Sandbox Code Playgroud)
类似于或。env.EnvironmentName 假设是。框架将尝试首先提取配置值。如果请求的值不存在,或者文件不存在,那么框架将尝试从."development""production""development"config.development.jsonconfig.development.jsonconfig.json
将您的部分配置config.json为如下服务:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(configuration.GetSubKey("AppSettings"));
services.Configure<DbSettings>(configuration.GetSubKey("DbSettings"));
services.Configure<EmailSettings>(configuration.GetSubKey("EmailSettings"));
}
Run Code Online (Sandbox Code Playgroud)
调用Configure<T>(IConfiguration)注册依赖注入容器中的IServiceCollection类型。IOptions<T>请注意,您不需要您的AppConfiguration课程。
然后指定要注入的依赖项,如下所示:
public class EmailController : Controller
{
private readonly IOptions<EmailSettings> emailSettings;
public EmailController (IOptions<EmailSettings> emailSettings)
{
this.emailSettings = emailSettings;
}
public IActionResult Index()
{
string apiKey = emailSettings.Options.EmailApiKey;
...
}
}
Run Code Online (Sandbox Code Playgroud)