如何从 appsettings.json 获取价值

how to get value from appsettings.json

public class Bar
{
    public static readonly string Foo = ConfigurationManager.AppSettings["Foo"];
}

在.NET Framework 4.x中,我可以使用ConfigurationManager.AppSettings ["Foo"]获取Webconfig中的Foo,然后我可以轻松获取[=的值13=] 到 Bar.Foo

但是在.Net core中,我必须注入options,并且无法通过Bar.Foo

获取Foo的值

有没有一种方法,可以直接通过Bar.Foo得到Foo的值?

所以实际上有两种方法可以解决这个问题。

选项 1:选项 Class

您有一个 appsettings.json 文件:

{
  "myConfiguration": {
    "myProperty": true 
  }
}

您像这样创建一个配置 POCO:

public class MyConfiguration
{
    public bool MyProperty { get; set; }
}

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

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MyConfiguration>(Configuration.GetSection("myConfiguration"));
}

然后在您的 controller/service 中注入 IOptions,它就可以使用了。

public class ValuesController : Controller
{
    private readonly MyConfiguration _myConfiguration;

    public ValuesController(IOptions<MyConfiguration> myConfiguration)
    {
        _myConfiguration = myConfiguration.Value;
    }
}

就我个人而言,我不喜欢使用 IOptions,因为我认为它会带来一些我并不真正想要的额外垃圾,但您可以使用它来做一些很酷的事情,例如热交换和其他东西。

选项 2:配置 POCO

它大部分是相同的,但在您的 Configure Services 方法中,您改为绑定到您的 POCO 的单例。

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

然后你就可以直接注入 POCO 了:

public class ValuesController : Controller
{
    private readonly MyConfiguration _myConfiguration;

    public ValuesController(MyConfiguration myConfiguration)
    {
        _myConfiguration = myConfiguration;
    }
}

有点简单化,因为您可能应该使用一个接口来使单元测试更容易一些,但您明白了。

大部分取自此处:http://dotnetcoretutorials.com/2016/12/26/custom-configuration-sections-asp-net-core/

您也可以直接使用configuration。您的设置已注入,因此您可以使用 DI 访问它们...

private readonly IConfiguration _configuration;

public MyClass(IConfiguration configuration)
{
    _configuration = configuration;
}

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

在这种情况下,我要取回一个系列...

var myList = _configuration.GetSection("MyList").Get<List<string>>();

上面的解决方案既费时又不简单,这是最有效的方法,启动时不需要任何设置。这就像使用好的 ol Configuration.Manager.AppSettings["setting"]

首先创建一个 class 像 "Credential":

public class Credential
  {
      public string Username {get;set}
      public string Password {get;set;}
  }

至此设置完毕,让我们像这样将 IConfiguration 放在您的构造函数上:

    private IConfiguration _configuration;
    public ValuesController(IConfiguration iconfig)
    {
        _configuration = iconfig;
    }

那你就可以调用了!

    Credential c = new Credential();
    c.UserName = _configuration.GetValue<string>("Credential:username");
    c.Password = _configuration.GetValue<string>("Credential:password");

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

"Credential": {
    "username": "myuser",
    "password": "mypassword"
  }

希望这对某人有所帮助。

  1. 将此添加到 AppSettings.json 文件
    "Swagger": { "Title": "API DEVELOPMENT" }

  2. 然后在Startup.cs文件中配置

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    
    public IConfiguration Configuration { get; }
    
  3. 接下来从appsettings.json

    获取值
    var title = Configuration.GetSection("Swagger:Title").Value;
    
  4. 终于放在这里

    services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = title, Version = "v1" }); }
    

来自@MindingData 的补充回答。我喜欢使用 Configuration.Bind(settings); 递归映射我的设置,这样我就不必在 ConfigureServices.

中添加每个新部分

示例:

appsettings.json:

{
    "MyConfiguration": {
        "MyProperty": true 
    }
}

设置 class,属性必须匹配 appsettings.json 名称:

public class Settings
{

    public MyConfigurationSettings MyConfiguration { get; set; }

    public class MyConfigurationSettings
    {
        public bool MyProperty { get; set; }
    }

}

Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {

        var settings = new Settings();
        Configuration.Bind(settings);
        services.AddSingleton(settings);
        ...

可以像这样在控制器中使用:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    private readonly Settings _settings;

    public ValuesController(Settings settings)
    {
        _settings = settings;
    }

    [HttpGet("GetValue")]
    public ActionResult<string> Get()
    {
        return Ok(_settings.MyConfiguration.MyProperty);
    }
}

将您的class定义为

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

当您从其他任何地方调用它时

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

如果您已经将您的配置传递给控制器​​并且不想在启动配置中映射其他服务,您可以通过这种方式轻松地从配置中获取您的值:

public Startup(IConfiguration configuration)
{
 Configuration = configuration;
  
 var myProperty = _configuration.GetSection("MyConfiguration")["MyProperty"];
}

使用字典 属性。

尽情享受