【问题标题】:ASP.NET 5 (vNext) - ConfigurationASP.NET 5 (vNext) - 配置
【发布时间】:2015-06-13 20:57:38
【问题描述】:

我正在尝试学习 ASP.NET 5。我在 Mac OS X 上使用它。此时,我有一个 config.json 文件,如下所示:

config.json

{
    "AppSettings": {
        "Environment":"dev"
    },

    "DbSettings": {
        "AppConnectionString": "..."
    },

    "EmailSettings": {
        "EmailApiKey": "..."        
    },  
}

我试图弄清楚如何将这些设置加载到 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; }
}

然后,在 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);
} 

但是,这种方法行不通。基本上,它不知道如何在 .json 和 Config 类之间进行映射。我该怎么做?

我真的很想继续使用 DI 方法,以便更有效地测试我的应用程序。

谢谢

【问题讨论】:

  • @KamranShahid 这没有解决这个问题。

标签: c# asp.net


【解决方案1】:

在您的Startup 类中,首先指定您的配置源:

private readonly IConfiguration configuration;

public Startup(IHostingEnvironment env)
{
    configuration = new Configuration()
        .AddJsonFile("config.json")
        .AddJsonFile($"config.{env.EnvironmentName}.json", optional: true);
}

env.EnvironmentName 类似于"development""production"。假设它是"development"。框架将首先尝试从config.development.json 中提取配置值。如果请求的值不存在,或者config.development.json 文件不存在,那么框架将尝试从config.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"));
}

IServiceCollection 上调用 Configure&lt;T&gt;(IConfiguration) 会在依赖注入容器中注册类型 IOptions&lt;T&gt;。请注意,您不需要 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;
        ...
    }
}

【讨论】:

  • 这是我目前的方法。但是,我想要一个包装类(即AppConfiguration),因为我打算在配置文件中有更多部分。我不想每次都注入一堆依赖项。为了保持我的代码简洁明了,我想使用单个包装类 (AppConfiguration),这样我只需要注入一个依赖项。
  • 更新后的方法对我不起作用。奇怪的是,我可以在智能感知中看到属性值。但是,以下确认 DbSettings 为空。 ` if (appConfiguration.Options.DbSettings == null) Console.WriteLine("db config has not been set"); else Console.WriteLine("db app config is set"); `
  • @ZachTempleton 对不起,我已经回滚了那个添加。看起来它不支持(还没有?)。
  • 啊哈。支持。这是一篇博文。 weblog.west-wind.com/posts/2015/Jun/03/…
  • GetSubKey 似乎已被弃用。现在我似乎无法弄清楚这应该如何工作。
【解决方案2】:

您可以在应用程序的任何位置使用 Configuration 类来简单地访问配置属性 Environment 的值。

var environment = Configuration["AppSettings:Environment"];

但是如果你希望它通过类的属性来访问你可以这样做

public class AppSettings 
{ 
 public string Environment
 { 
 get 
 { 
  return new Configuration().Get("AppSettings:Environment").ToString(); 
 }
 set; 
 } 
}

注意我没有在setter中设置Environment的值,因为这个值会在config.json中,所以不需要在setter中设置这个值。

更多详情请查看article

【讨论】:

    【解决方案3】:

    尝试使用OptionsModel。它允许强类型模型绑定到配置。

    class AppSettings
    {
       public string SomeSetting {get;set;}
    }
    
    var configuration = new Configuration().AddJsonFile("config.json");
    var opt = ConfigurationBinder.Bind<AppSettings>(configuration);
    opt.SomeSetting 
    

    示例: https://github.com/aspnet/Options/blob/dev/test/Microsoft.Framework.OptionsModel.Test/OptionsTest.cs#L80

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 1970-01-01
      • 2016-04-09
      • 2015-06-26
      • 2015-10-12
      • 1970-01-01
      • 2015-01-29
      • 2016-08-21
      相关资源
      最近更新 更多