ASP.NET 5(vNext) - 获取配置设置

xam*_*per 42 .net c# asp.net .net-core asp.net-core

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

var settingValue = ConfigurationManager.AppSettings["SomeKey"];
Run Code Online (Sandbox Code Playgroud)

我会在我的代码中散布各种代码.现在,在vNext世界中,我有一个如下所示的config.json文件:

config.json

{
  "AppSettings": {
    "SomeKey":"SomeValue"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

从那里,我完全难过.我在/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;
  }
}
Run Code Online (Sandbox Code Playgroud)

如何获得"AppSettings:SomeKey"的值?

Ric*_*ard 15

ASP.NET 5大量使用依赖注入,所以如果你也使用依赖注入,那么这很简单.如果您检查示例MVC6项目,您可以看到它是如何工作的:

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

public class AppSettings
{
    public string SiteTitle { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,通过ConfigureServices中的依赖注入初始化此类. Configuration这是您在Startup类的构造函数中创建的那个.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后,假设您的类由依赖注入容器实例化,您可以简单地请求IOptions,然后您将获得一个.例如,在控制器中,您可以具有以下内容:

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

  • 有几种方法.对于根级别的东西使用`Configuration.GetSection("AppSettings")`对于嵌套的东西使用`Configuration ["Data:DefaultConnection:ConnectionString"]` (6认同)
  • 需要注意的是,截至今天已经有了Asp.Net Core RC1和RC2*来*,这个*Options Model*是建议的方式.接口改变了一点:现在它将是`settings.Value.SiteTitle`,加上`ConfigureServices`需要`services.AddOptions();`用DI设置选项 (3认同)
  • @SerjSagan你是如何让这个工作的.在我的系统上``Configuration`没有`GetSubKey`方法. (2认同)

小智 14

我使用ASP.NET 5依赖注入,就像这样.

config.json:

{
    "random":  "Hello World!"
}
Run Code Online (Sandbox Code Playgroud)

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?}");
        });

    }

}
Run Code Online (Sandbox Code Playgroud)

控制器:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)


Vic*_*aci 13

我强烈建议您使用OptionsModel而不是直接读取配置.它允许强类型模型绑定到配置.

下面是一个示例:GitHub.com/aspnet/Options/test/Microsoft.Extensions.Options.Test/OptionsTest.cs

对于您的特定情况,创建一个模型:

class AppSettings {
    public string SomeSetting {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

然后将其绑定到您的配置:

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

这样您就不必担心设置的来源,存储方式或结构.您只需预定义您的选项模型并发生魔术.

  • @VictorHurdugaci感谢您修复链接,不幸的是对我来说,我仍然不知道如何从`project.json`或`config.json`实际获取数据. (2认同)

mas*_*son 12

用这个:

var value = Configuration.Get("AppSettings:SomeKey");
Run Code Online (Sandbox Code Playgroud)

基于这篇博文.冒号类似于点表示法,用于在层次结构中向下导航.

如果你需要其他类中的值,你应该将其注入.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @VictorHurdugaci当然欢迎你使用你认为合适的downvotes.但我认为这是一个非常糟糕的理由,可能会拒绝某人的回答.这是一个新架构,我不知道这个选项.我已经看过贵公司的大量演示,但没有一个演示过强类型模型绑定选项.我的答案会很好,干净地展示如何解决问题.当然强类型的模型绑定很不错,但我认为对于那些有替代工作答案的人来说是很粗鲁的,特别是如果我的公司是建议他们的人. (19认同)
  • @Victor严重糟糕的形式只是因为你更喜欢你的方式来贬低别人的答案.Downvotes是错误的答案或不恰当的答案.如果答案以一种有效的方式回答问题,那么就表现出一些尊重. (9认同)