C# 如何将appsettings中的默认值设置为API模型上的属性

C# 如何将appsettings中的默认值设置为API模型上的属性,c#,dependency-injection,.net-core,C#,Dependency Injection,.net Core,如何在由.NET Core 3 framework实例化的模型上,从appsettings.json文件中读取属性,为属性设置默认值 我创建了一个全新的.NET Core 3项目的回购协议,我试图在其中说明问题: API行动: [HttpGet] 公共IEnumerable Get[FromQuery]FilteringRequestModel请求 { var defaultType=request.Type; var rng=新的随机变量; 返回Enumerable.Range1,5.Sele

如何在由.NET Core 3 framework实例化的模型上,从appsettings.json文件中读取属性,为属性设置默认值

我创建了一个全新的.NET Core 3项目的回购协议,我试图在其中说明问题:

API行动:

[HttpGet] 公共IEnumerable Get[FromQuery]FilteringRequestModel请求 { var defaultType=request.Type; var rng=新的随机变量; 返回Enumerable.Range1,5.Selectindex=>new WeatherForecast { 日期=DateTime.Now.AddDaysindex, 温度c=rng.Next-20,55, 摘要=摘要[rng.NEXTSUMMARES.Length] } .托雷; } 型号:

公共类筛选器GrequesModel { /*请注意,我们必须有一个无参数构造函数,因为稳定这个对象是框架的职责 *调用此操作时:IEnumerable Get[FromQuery]FilteringRequestModel请求 */ 公共筛选器请求模型 { //类型=System.Configuration.ConfigurationManager.AppSettings[DefaultTypeTopRated]; } 公共字符串类型{get;set;}=top_rated;//TODO:从appsettings读取 }
您可以将IOptions与Dependecy注入一起使用

更新FilteringRequestModel类

像这样更新appsettings.Development.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "FilteringRequest": {
    "Type":  "foo"
  }
}
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<FilteringRequestSettings>(this.Configuration.GetSection("FilteringRequest"));

    services.AddControllers();
}
[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();
}
像这样更新启动类中的ConfigureServices方法

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "FilteringRequest": {
    "Type":  "foo"
  }
}
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<FilteringRequestSettings>(this.Configuration.GetSection("FilteringRequest"));

    services.AddControllers();
}
[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();
}
解释

您将把参数从appsettings加载到 眼压 IOptions将被注入到 天气预报控制器 然后,您将在请求中调用Initialize方法 带IOptions的参数 Initialize方法验证是否尚未从查询/请求中设置Type属性。如果不是,它将通过IOptions使用appsettings中的值
为什么要在构造函数中对设置进行注释?因为它不工作,所以它返回null,而它不应该返回null。请在实例化类实例的行上放置一个调试点,并在该点检查对象属性。您没有在代码中显示该点。传递到Get方法的对象可能没有该属性集。因此,从var request=new FilteringRequestModel开始,然后在调试器中前进一步。当我们调用Get端点时,这项工作是.NET核心框架的责任。我这里有所有的代码:只是一个简单的控制器+模型这是一个很好的解决方案,但是,基于这个解决方案,我们不使用默认的初始值,当对象被实例化时,该值为null。此外,我们需要在控制器上添加一些逻辑。我希望在无参数构造函数中有一些魔力,比如通过DI获得一些依赖项,但我猜这是不可能的。顺便说一句,谢谢你的叉子,它有助于测试它!因为无参数构造函数用于创建模型。不能使用基于构造函数注入的.NET核心默认依赖项注入。也许您可以使用另一个DI容器(如autofac)来使用属性注入?这是一个解决方案,是的。。。所以,对于.NET核心,默认依赖项注入是不可能的,是吗?