首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从.net核心中的appsettings.json获取价值

从.net核心中的appsettings.json获取价值
EN

Stack Overflow用户
提问于 2017-10-26 03:33:08
回答 14查看 443.3K关注 0票数 266

我不确定这里遗漏了什么,但我无法从.net核心应用程序中的appsettings.json获取值。我的appsettings.json是这样的:

代码语言:javascript
复制
{
    "AppSettings": {
        "Version": "One"
    }
}

启动:

代码语言:javascript
复制
public class Startup
{
    private IConfigurationRoot _configuration;
    public Startup(IHostingEnvironment env)
    {
        _configuration = new ConfigurationBuilder()
    }
    public void ConfigureServices(IServiceCollection services)
    {
      //Here I setup to read appsettings        
      services.Configure(_configuration.GetSection("AppSettings"));
    }
}

型号:

代码语言:javascript
复制
public class AppSettings
{
    public string Version{ get; set; }
}

控制器:

代码语言:javascript
复制
public class HomeController : Controller
{
    private readonly AppSettings _mySettings;

    public HomeController(IOptions settings)
    {
        //This is always null
        _mySettings = settings.Value;
    }
}

始终为空。我是不是漏掉了什么?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2017-10-26 03:40:07

Program和Startup类

.NET核心2.x

你不需要新的

构造函数。它的实现将由DI系统注入。

代码语言:javascript
复制
// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup()
            .Build();            
}

// Startup.cs
public class Startup
{
    public IHostingEnvironment HostingEnvironment { get; private set; }
    public IConfiguration Configuration { get; private set; }

    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        this.HostingEnvironment = env;
        this.Configuration = configuration;
    }
}

.NET核心1.x

你需要告诉我

若要加载appsettings文件,请执行以下操作。

代码语言:javascript
复制
// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup()
            .UseApplicationInsights()
            .Build();

        host.Run();
    }
}

//Startup.cs
public class Startup
{
    public IConfigurationRoot Configuration { get; private set; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        this.Configuration = builder.Build();
    }
    ...
}

获取值

有许多方法可以从应用程序设置中获取您配置的值:

简单的使用方法

使用

选项模式

让我们说你的

如下所示:

代码语言:javascript
复制
{
    "ConnectionStrings": {
        ...
    },
    "AppIdentitySettings": {
        "User": {
            "RequireUniqueEmail": true
        },
        "Password": {
            "RequiredLength": 6,
            "RequireLowercase": true,
            "RequireUppercase": true,
            "RequireDigit": true,
            "RequireNonAlphanumeric": true
        },
        "Lockout": {
            "AllowedForNewUsers": true,
            "DefaultLockoutTimeSpanInMins": 30,
            "MaxFailedAccessAttempts": 5
        }
    },
    "Recaptcha": { 
        ...
    },
    ...
}

简单的方法

您可以将整个配置注入到您的控制器/类的构造函数中(通过

),并使用指定的key获取您想要的值:

代码语言:javascript
复制
public class AccountController : Controller
{
    private readonly IConfiguration _config;

    public AccountController(IConfiguration config)
    {
        _config = config;
    }

    [AllowAnonymous]
    public IActionResult ResetPassword(int userId, string code)
    {
        var vm = new ResetPasswordViewModel
        {
            PasswordRequiredLength = _config.GetValue(
                "AppIdentitySettings:Password:RequiredLength"),
            RequireUppercase = _config.GetValue(
                "AppIdentitySettings:Password:RequireUppercase")
        };

        return View(vm);
    }
}

选项模式

The The The

如果您只需要应用程序设置中的一个或两个值,则效果很好。但是,如果您想要从应用程序设置中获取多个值,或者您不想在多个位置对这些关键字符串进行硬编码,那么它可能更易于使用

选项模式

..。选项模式使用类来表示层次结构/结构。

要使用选项模式,请执行以下操作:

定义表示结构的类

注册这些类绑定到的配置实例

注入

放入要获取值的控制器/类的构造函数中

1.定义表示结构的配置类

您可以定义具有以下属性的类

需要完全匹配

应用程序设置中的密钥。类的名称不必与应用程序设置中的节的名称匹配:

代码语言:javascript
复制
public class AppIdentitySettings
{
    public UserSettings User { get; set; }
    public PasswordSettings Password { get; set; }
    public LockoutSettings Lockout { get; set; }
}

public class UserSettings
{
    public bool RequireUniqueEmail { get; set; }
}

public class PasswordSettings
{
    public int RequiredLength { get; set; }
    public bool RequireLowercase { get; set; }
    public bool RequireUppercase { get; set; }
    public bool RequireDigit { get; set; }
    public bool RequireNonAlphanumeric { get; set; }
}

public class LockoutSettings
{
    public bool AllowedForNewUsers { get; set; }
    public int DefaultLockoutTimeSpanInMins { get; set; }
    public int MaxFailedAccessAttempts { get; set; }
}

2.注册配置实例

然后,您需要将此配置实例注册到

在启动过程中:

代码语言:javascript
复制
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
...

namespace DL.SO.UI.Web
{
    public class Startup
    {
        ...
        public void ConfigureServices(IServiceCollection services)
        {
            ...
            var identitySettingsSection = 
                _configuration.GetSection("AppIdentitySettings");
            services.Configure(identitySettingsSection);
            ...
        }
        ...
    }
}

3.注入IOptions

最后,在要获取值的控制器/类上,需要注入

通过构造函数:

代码语言:javascript
复制
public class AccountController : Controller
{
    private readonly AppIdentitySettings _appIdentitySettings;

    public AccountController(IOptions appIdentitySettingsAccessor)
    {
        _appIdentitySettings = appIdentitySettingsAccessor.Value;
    }

    [AllowAnonymous]
    public IActionResult ResetPassword(int userId, string code)
    {
        var vm = new ResetPasswordViewModel
        {
            PasswordRequiredLength = _appIdentitySettings.Password.RequiredLength,
            RequireUppercase = _appIdentitySettings.Password.RequireUppercase
        };

        return View(vm);
    }
}
票数 374
EN

Stack Overflow用户

发布于 2018-08-10 14:59:42

只需创建一个AnyName.cs文件并粘贴以下代码即可。

代码语言:javascript
复制
using System;
using System.IO;
using Microsoft.Extensions.Configuration;

namespace Custom
{
    static class ConfigurationManager
    {
        public static IConfiguration AppSetting { get; }
        static ConfigurationManager()
        {
            AppSetting = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("YouAppSettingFile.json")
                    .Build();
        }
    }
}

必须将YouAppSettingFile.json文件名替换为您的文件名。

您的.json文件应该如下所示。

代码语言:javascript
复制
{
    "GrandParent_Key" : {
        "Parent_Key" : {
            "Child_Key" : "value1"
        }
    },
    "Parent_Key" : {
        "Child_Key" : "value2"
    },
    "Child_Key" : "value3"
}

现在你可以使用它了。

别忘了

添加引用

在你想要使用的类中。

代码语言:javascript
复制
using Custom;

检索值的代码。

代码语言:javascript
复制
string value1 = ConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];
string value2 = ConfigurationManager.AppSetting["Parent_Key:Child_Key"];
string value3 = ConfigurationManager.AppSetting["Child_Key"];
票数 63
EN

Stack Overflow用户

发布于 2018-02-22 19:12:16

除了大卫·梁对以下问题的回答

核心2.0

-

链接到的文件

变量。

可以设置为任何值,但框架支持三个值:

,以及

..。如果

未设置,则默认为

..。

对于这三个值,

appsettings.ASPNETCORE

_

ENVIRONMENT.json

支持开箱即用的文件-

以上三个应用程序设置json文件可用于配置多个环境。

示例:

代码语言:javascript
复制
{
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "System": "Information",
            "Microsoft": "Information"
        }
    },
    "MyConfig": "My Config Value for staging."
}

使用

检索任何配置值。

代码语言:javascript
复制
public class Startup
{
    public Startup(IHostingEnvironment env, IConfiguration config)
    {
        Environment = env;
        Configuration = config;
        var myconfig = Configuration["MyConfig"];
    }

    public IConfiguration Configuration { get; }
    public IHostingEnvironment Environment { get; }
}
票数 55
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46940710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档