简体   繁体   English

如何将 appsettings 中的默认值设置为 API Model 上的属性

[英]How to set a default value from appsettings to a property on a API Model

How can I set a default value to a property, reading it from my appsettings.json file, on a model that is instantiated by the .NET Core 3 framework?如何在由 .NET Core 3 框架实例化的 model 上的 appsettings.json 文件中为属性设置默认值?

I've created a repo (a completely new .NET Core 3 project) where I try to illustrate the problem: https://github.com/NelsonPRSousa/dependency-injection-default-constructor我创建了一个存储库(一个全新的 .NET Core 3 项目),我试图在其中说明问题: https://github.com/NelsonPRSousa/dependency-injection-default-constructor

API Action: API 动作:

[HttpGet]
public IEnumerable<WeatherForecast> Get([FromQuery] FilteringRequestModel request)
{

    var defaultType = request.Type;

    var rng = new Random();
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = rng.Next(-20, 55),
        Summary = Summaries[rng.Next(Summaries.Length)]
    })
    .ToArray();
}

Model: Model:

public class FilteringRequestModel
{
    /* Please note that we must have a parameterless constructor, since it's the framework responsability to instatiate this object
     * when invoking this action: IEnumerable<WeatherForecast> Get([FromQuery] FilteringRequestModel request)
     */

    public FilteringRequestModel()
    {
        //Type = System.Configuration.ConfigurationManager.AppSettings["DefaultTypeTopRated"];
    }

    public string Type { get; set; } = "top_rated"; // TODO: Read from appsettings
}

You could use IOptions with Dependecy Injection您可以将 IOptions 与依赖注入一起使用

Update FilteringRequestModel class更新FilteringRequestModel class

public class FilteringRequestModel
{
    public FilteringRequestModel()
    {
    }

    public void Initialize(IOptions<FilteringRequestSettings> settings)
    {
        if (string.IsNullOrEmpty(this.Type))
        {
            this.Type = settings.Value.Type;
        }
    }

    public string Type { get; set; }
}

Add a FilteringRequestSettings class添加FilteringRequestSettings class

public class FilteringRequestSettings
{
    public string Type { get; set; }
}

Update appsettings.Development.json like this像这样更新appsettings.Development.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "FilteringRequest": {
    "Type":  "foo"
  }
}

Update ConfigureServices method in Startup class like this像这样更新Startup class 中的ConfigureServices方法

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<FilteringRequestSettings>(this.Configuration.GetSection("FilteringRequest"));

    services.AddControllers();
}

Finally, update WeatherForecastController class like this最后,像这样更新WeatherForecastController class

[HttpGet]
public IEnumerable<WeatherForecast> Get([FromQuery] FilteringRequestModel request)
{
    request.Initialize(_settings);

    var defaultType = request.Type;

    var rng = new Random();
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = rng.Next(-20, 55),
        Summary = Summaries[rng.Next(Summaries.Length)]
    })
    .ToArray();
}

Explanation解释

  • You will load parameter from appsettings into IOptions<FilteringRequestSettings>您将从 appsettings 加载参数到IOptions<FilteringRequestSettings>
  • IOptions<FilteringRequestSettings> will be injected into WeatherForecastController IOptions<FilteringRequestSettings>将被注入WeatherForecastController
  • You will then call the Initialize method your request parameter with IOptions<FilteringRequestSettings>然后,您将使用IOptions<FilteringRequestSettings>调用您的request参数的Initialize方法
  • The Initialize method verify if the Type property has not already been set (from query / request). Initialize方法验证是否尚未设置Type属性(来自查询/请求)。 If not, it will use the value from appsettings (through IOptions<FilteringRequestSettings>如果不是,它将使用 appsettings 中的值(通过IOptions<FilteringRequestSettings>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM