ASP.NET 5(vNext) - 配置

Som*_*ser 9 c# asp.net

我正在尝试学习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方法,这样我就可以更有效地测试我的应用程序.

谢谢

Tim*_*lds 4

在您的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)