如何从appsettings.json获取价值

时间:2017-05-03 10:14:24

标签: .net appsettings

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

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

但在.Net核心中,我必须注入options,并且无法通过Foo

获取Bar.Foo的值

是否有方法,可以直接通过Bar.Foo获取Foo的值?

7 个答案:

答案 0 :(得分:54)

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

选项1:选项类

你有一个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"));
}

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

public class ValuesController : Controller
{
    private readonly MyConfiguration _myConfiguration;

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

就我个人而言,我不喜欢使用IOptions,因为我觉得它拖累了一些我并不想要的额外垃圾,但是你可以做一些很酷的事情,比如热插拔等等。

选项2:配置POCO

它大致相同,但在您的配置服务方法中,您改为绑定到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/

答案 1 :(得分:18)

您也可以直接使用配置。注入您的设置,以便您可以使用DI ...

private readonly IConfiguration _configuration;

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

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

在这种情况下,我收集了一个收藏......

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

答案 2 :(得分:6)

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

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

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

希望这对某人有帮助。

答案 3 :(得分:1)

从@MindingData回答的其他内容。我喜欢使用Configuration.Bind(settings);来递归映射设置,这样就不必在ConfigureServices中添加每个新部分。

示例:

appsettings.json:

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

Settings类,属性必须与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);
    }
}

答案 4 :(得分:1)

将您的班级定义为

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)

答案 5 :(得分:1)

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

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

使用字典属性。

享受

答案 6 :(得分:0)

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