如何从appsettings.json获取价值

Chi*_*iYu 41 .net appsettings

public class Bar
{
    public static readonly string Foo = ConfigurationManager.AppSettings["Foo"];
}
Run Code Online (Sandbox Code Playgroud)

在.NET Framework 4.x的,我可以用ConfigurationManager.AppSettings ["Foo"]得到FooWebconfig,然后我可以轻松地获得的值Foo通过Bar.Foo

但是在.Net核心中,我必须注入options,并且无法获得Foo通过的价值Bar.Foo

有没有一种方法,可以直接通过Bar.Foo获取值来获得 Foo

Min*_*ata 62

所以有两种方法可以解决这个问题.

选项1:选项类

你有一个appsettings.json文件:

{
  "myConfiguration": {
    "myProperty": true 
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样创建配置POCO:

public class MyConfiguration
{
    public bool MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在您的startup.cs中,您在ConfigureServices中有一些注册配置的东西:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MyConfiguration>(Configuration.GetSection("myConfiguration"));
}
Run Code Online (Sandbox Code Playgroud)

然后在您的控制器/服务中注入IOptions并且它是可用的.

public class ValuesController : Controller
{
    private readonly MyConfiguration _myConfiguration;

    public ValuesController(IOptions<MyConfiguration> myConfiguration)
    {
        _myConfiguration = myConfiguration.Value;
    }
}
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我不喜欢使用IOptions,因为我认为它拖累了一些我并不想要的额外垃圾,但是你可以做一些很酷的事情,比如热交换和其中的东西.

选项2:配置POCO

它大致相同,但在您的配置服务方法中,您改为绑定到POCO的单个部分.

public void ConfigureServices(IServiceCollection services)
{
    //services.Configure<MyConfiguration>(Configuration.GetSection("myConfiguration"));
    services.AddSingleton(Configuration.GetSection("myConfiguration").Get<MyConfiguration>());
}
Run Code Online (Sandbox Code Playgroud)

然后你可以直接注入POCO:

public class ValuesController : Controller
{
    private readonly MyConfiguration _myConfiguration;

    public ValuesController(MyConfiguration myConfiguration)
    {
        _myConfiguration = myConfiguration;
    }
}
Run Code Online (Sandbox Code Playgroud)

有点简单,因为你应该使用一个接口来使单元测试更容易,但你明白了.

主要来自这里:http://dotnetcoretutorials.com/2016/12/26/custom-configuration-sections-asp-net-core/

  • @ChiakiYu你不应该使用静态类或属性进行配置 - 这被认为是一种不好的做法 (4认同)
  • 谢谢您的回答.但是,这两种方法都需要`IOptions <MyConfiguration>`或`MyConfiguration`.如果我使用静态类/静态属性,我该怎么办? (3认同)

Dav*_*kle 19

您也可以直接使用配置.您的设置被注入,因此您可以通过DI获取它们...

private readonly IConfiguration _configuration;

public MyClass(IConfiguration configuration)
{
    _configuration = configuration;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以阅读你的设置......

在这种情况下,我收到一个回收...

var myList = _configuration.GetSection("MyList").Get<List<string>>();
Run Code Online (Sandbox Code Playgroud)

  • @PinoyDev当然可以 - 它是一个构造函数,readonly变量可以从构造函数赋值 (3认同)

Pin*_*Dev 15

最上面的解决方案很耗时且不简单,这是实现此目的的最佳有效方法,无需在启动时进行任何设置。就像使用良好的ol Configuration.Manager.AppSettings [“ setting”]

首先创建一个类似“ Credential”的类:

public class Credential
  {
      public string Username {get;set}
      public string Password {get;set;}
  }
Run Code Online (Sandbox Code Playgroud)

现在完成设置,将IConfiguration放在您的构造函数上,如下所示:

    private IConfiguration _configuration;
    public ValuesController(IConfiguration iconfig)
    {
        _configuration = iconfig;
    }
Run Code Online (Sandbox Code Playgroud)

然后您就可以调用它了!

    Credential c = new Credential();
    c.UserName = _configuration.GetValue<string>("Credential:username");
    c.Password = _configuration.GetValue<string>("Credential:password");
Run Code Online (Sandbox Code Playgroud)

假设您的appsettings.json看起来像这样:

"Credential": {
    "username": "myuser",
    "password": "mypassword"
  }
Run Code Online (Sandbox Code Playgroud)

希望这对某人有帮助。


小智 8

将您的班级定义为

public class MyClass{
   private readonly IConfiguration _configuration;
   public MyClass(IConfiguration configuration)
        {
            _configuration = configuration;
        }
   public void myFunction(){
       var value= _configuration.GetValue("xxx");
}
}
Run Code Online (Sandbox Code Playgroud)

当你从其他地方调用它时

IConfiguration config = new ConfigurationBuilder()
                    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: false).Build();
MyClass myclass = new MyClass(config)
Run Code Online (Sandbox Code Playgroud)