首页 > 解决方案 > 从 appsettings.json 绑定部分到选项

问题描述

因此,我试图遵循 Microsoft Docs,ASP.NET Core 中的选项模式,但是在我的一生中,我似乎无法正确地将“AppSettings”部分作为选项添加到我的 AppSettings 对象中。Configuration.GetSection("AppSettings"); 正在为我返回 null

appsettings.Development.json

{
  "AppSettings": {
    "Secret": "DEVELOPMENTTOKENTEST"
  },
  "Serilog": {
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Default": "Information",
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    },
    "Enrich": [ "FromLogContext", "WithMachineName" ],
    "Properties": {
      "Application": "Oasis.API"
    },
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "Logs/api_.log",
          "outputTemplate": "{Timestamp:o} [{Level:u3}] ({SourceContext}) {Message}{NewLine}{Exception}",
          "rollingInterval": "Day",
          "retainedFileCountLimit": 1
        }
      }
    ]
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=JS-PC;Initial Catalog=Oasis;Integrated Security=True"
  }
}

我的 AppSettings 部分的类。

public class AppSettings
{
        public string Secret { get; set; }
}

我如何尝试阅读该部分并将其配置为在服务中使用的依赖注入。

启动.cs

public void ConfigureServices(IServiceCollection services)
{
            services.AddCors();
            services.AddControllers();

            // Configure API secret
            var test = Configuration.GetSection("AppSettings"); // null... oh?
            services.Configure<AppSettings>(con => Configuration.GetSection("AppSettings").Bind(con));

            // Swagger generation
            services.AddSwaggerGen();

            // Database and Repositories
            ConfigureRepositories(services);
            
            // Register Services
            ConfigureServiceClasses(services);
}

这是我如何设置在我的服务中使用 IOptions。
网络用户服务.cs

public class WebUserService : IWebUserService
{
        private readonly ILogger<WebUserService> _logger;

        private readonly IWebUserRepository _webUserRepository;

        private readonly AppSettings _appSettings;

        public WebUserService(ILogger<WebUserService> logger, IWebUserRepository webUserRepository, IOptions<AppSettings> appSettings)
        {
            _logger = logger;
            _webUserRepository = webUserRepository;
            _appSettings = appSettings.Value;
        }
}

在此处输入图像描述

标签: asp.net-coreasp.net-core-3.1appsettings

解决方案


您不需要设置。它的实现将由 DI 系统注入。您可以使用以下方法获取Secret

using Microsoft.Extensions.Configuration;
//....
private readonly IConfiguration _mySettings;
public HomeController(IConfiguration mySettings)
    {
        _mySettings = mySettings;
    }
public IActionResult Index()
    {
        var result = _mySettings.GetValue<string>("AppSettings:Secret");
        //...
    }

测试结果: 在此处输入图像描述

顺便说一句,如果你想注入它,你可以使用下面的代码。

 //...
  var settingsSection =Configuration.GetSection("AppSettings");
  services.Configure<AppSettings>(settingsSection);

在控制器中:

 private readonly IConfiguration _mySettings;
 private readonly AppSettings _settings;

 public HomeController(IOptions<AppSettings> settingsAccessor, IConfiguration mySettings)
    {
        _mySettings = mySettings;
         _settings = settingsAccessor.Value;
    }
  public IActionResult Index()
    {
        var vm = new AppSettings
        {
          Secret= _settings.Secret
        };
        var result = _mySettings.GetValue<string>("AppSettings:Secret");
    }

测试结果: 在此处输入图像描述

参考这个线程


推荐阅读