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

本文关键字:获取 配置 设置 vNext NET ASP | 更新日期: 2023-09-27 17:49:21

我正在写一个基本的应用程序来学习ASP。净5。我发现非常令人困惑的一个地方是配置。在ASP之前。. NET 5,我可以做以下操作:

var settingValue = ConfigurationManager.AppSettings["SomeKey"];

我会在我的代码中散布这样的代码行。现在,在vNext世界中,我有一个配置。Json文件看起来像这样:

json

{
  "AppSettings": {
    "SomeKey":"SomeValue"
  }
}

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

public IConfiguration Configuration { get; set; }
public Startup(IHostingEnvironment environment) 
{
  Configuration = new Configuration()
      .AddJsonFile("config.json");
}
从那以后,我完全被难住了。我有MyClass.cs在/src/Website/Code/Models/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"的值?

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

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

首先,在Properties中定义了一个类AppSettings,它是类支持的选项的强类型版本。在样例项目中,它只包含SiteTitle。

public class AppSettings
{
    public string SiteTitle { get; set; }
}
然后,这个类通过ConfigureServices中的依赖注入被初始化。这里的Configuration是在Startup类的构造函数中创建的。
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));
    // ...
}

然后,假设你的类是由依赖注入容器实例化的,你可以简单地请求一个IOptions,你就会得到一个。例如,在控制器中,您可以使用以下命令:

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

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

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

我强烈建议使用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);

这样,您就不必担心设置来自何处,如何存储或结构是什么。您只需预先定义您的选项模型,奇迹就会发生。

使用

var value = Configuration.Get("AppSettings:SomeKey");

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

如果需要在其他类中使用该值,则应该将其注入。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;
    }
}