[英]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解释
IOptions<FilteringRequestSettings>
IOptions<FilteringRequestSettings>
IOptions<FilteringRequestSettings>
will be injected into WeatherForecastController
IOptions<FilteringRequestSettings>
将被注入WeatherForecastController
Initialize
method your request
parameter with IOptions<FilteringRequestSettings>
IOptions<FilteringRequestSettings>
调用您的request
参数的Initialize
方法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>
IOptions<FilteringRequestSettings>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.