Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

🍀简介

Options是.net Core Web api框架自带的功能,Options模式通过定义强类型的类来表示相关配置设置的集合,使得配置管理更为结构化和类型安全。

IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许开发者以强类型的方式访问应用的配置设置。具体分析如下:

  1. IOptions:此接口提供了对配置设置的单例访问。它在整个应用程序生命周期中保持相同的实例,这意味着即使在配置文件更改后,通过IOptions获取的值也不会改变。因此,如果需要在程序运行期间更新配置信息,则不应该使用IOptions。

  2. IOptionsMonitor:与IOptions不同,IOptionsMonitor是一个单例服务,但它可以监听配置文件的更改并自动更新其值。当文件发生更改时,它会自动重新加载配置,使得下一次访问CurrentValue属性时能够获取到最新的配置值。这种机制使得IOptionsMonitor适用于那些需要实时反映配置更改的场景。

  3. IOptionsSnapshot:IOptionsSnapshot的生命周期是作用域(Scoped),这意味着对于每一次HTTP请求,都会提供一个新的实例。如果在请求过程中配置文件发生了更改,这个实例仍然保持旧的值,直到新的请求到达,才会获取到新的配置值。因此,IOptionsSnapshot适合用在那些需要每个请求都使用最新配置快照的场景。

🐳案例

新建一个ASP.NET Core Web Application项目

首先在项目自带的appsettings.json配置文件中加入我们要添加的配置项,如下的myConfig

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "myConfig": {
    "year": 2024,
    "month": "6月",
    "name": "爱吃香蕉的阿豪"
  }
}

创建myConfig类

namespace ConfigTest;

public class MyConfig
{
    public int year { get; set; }

    public string month { get; set; }

    public string name { get; set; }
}

在Program类中配置ASP.NET Core应用程序中的依赖注入服务。使用builder.Services.Configure<T>()方法,将配置文件中名为"myConfig"的部分映射到MyConfig类的实例。这样,你可以在应用程序中使用IOptions<MyConfig>接口来访问配置信息。

builder.Services.Configure<MyConfig>(
    builder.Configuration.GetSection("myConfig"));

 新建一个Controllere,在控制器中注入了一个IOptionsSnapshot<MyConfig>类型的依赖,用于获取配置信息。

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

namespace ConfigTest.Controllers;

[ApiController]
[Route("[controller]/[action]")]
public class GetConfigController : ControllerBase
{
    private readonly IOptionsSnapshot<MyConfig> _options;

    public GetConfigController(IOptionsSnapshot<MyConfig> options)
    {
        _options = options;
    }

    [HttpGet]
    public IActionResult GetConfig()
    {
        return Ok(_options.Value);
    }
}

 启动项目,在swagger中请求一下,成功拿到我们的配置数据

🐳其他访问配置选项的接口

🐤IOptions<TOptions>

在上面的案例中我们使用的就是IOptions,IOptions<TOptions> 是最简单的接口,它提供了一个对配置选项的访问点,这些选项在应用程序的生命周期内是静态的。一旦配置被读取,它将保持不变,除非你显式地替换它。

🐤IOptionsSnapshot<TOptions>

IOptionsSnapshot<TOptions> 在每次请求时都会创建一个选项的新实例(如果配置已更改)。它适用于那些在每个请求中可能需要不同配置值的场景。请注意,由于它在每个请求时都创建新实例,因此它可能比IOptions<TOptions>IOptionsMonitor<TOptions>开销更大。

🐤IOptionsMonitor<TOptions>

IOptionsMonitor<TOptions> 提供了对配置选项的访问,并支持选项的更改通知。当IConfiguration中的相关部分更改时,它可以触发一个回调或允许你检查选项是否已更改。

如果你想要监视配置的变化,并在配置发生变化时执行某些操作(例如重新加载缓存、发送通知等),那么应该使用IOptionsMonitor

using Microsoft.AspNetCore.Mvc;  
using Microsoft.Extensions.Options;  
  
namespace ConfigTest.Controllers;  
  
[ApiController]  
[Route("[controller]/[action]")]  
public class GetConfigController : ControllerBase  
{  
    private readonly IOptionsMonitor<MyConfig> _optionsMonitor;  
  
    public GetConfigController(IOptionsMonitor<MyConfig> optionsMonitor)  
    {  
        _optionsMonitor = optionsMonitor;  
  
        // 你可以在这里注册一个回调,当配置发生变化时执行某些操作  
        _optionsMonitor.OnChange(options =>  
        {  
            // 例如,当配置发生变化时,你可以在这里记录一条消息或重新加载缓存  
            Console.WriteLine("MyConfig has changed.");  
        });  
    }  
  
    [HttpGet]  
    public IActionResult GetConfig()  
    {  
        // 获取当前的配置值  
        return Ok(_optionsMonitor.CurrentValue);  
    }  
}

🐳注意事项

  • IOptions<TOptions> 是最简单的,并且对于大多数应用程序来说可能就足够了。
  • IOptionsMonitor<TOptions> 提供了更改通知功能,如果你需要知道配置何时更改,那么它很有用。
  • IOptionsSnapshot<TOptions> 在每个请求时都会重新评估配置,这可能会带来一些性能开销,但如果你需要在每个请求中使用不同的配置值,那么它很有用。
  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,您需要在ASP.NET Core项目中添加Microsoft.AspNetCore.Http和Microsoft.AspNetCore.StaticFiles包。然后在您的控制器中添加以下代码: ```csharp [HttpPost] [Route("api/uploadvideo")] public async Task<IActionResult> UploadVideo(IFormFile file) { if (file == null || file.Length == 0) { return BadRequest("File not selected."); } // Set the path where the video will be stored var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "videos", file.FileName); // Create the file in the specified path using (var stream = new FileStream(path, FileMode.Create)) { await file.CopyToAsync(stream); } return Ok("Video uploaded successfully."); } ``` 在这个示例中,我们使用`HttpPost`属性来指定这是一个POST请求,并使用`Route`属性来设置API的路由。我们还使用`IFormFile`类型的参数来接收上传的视频文件。 在方法中,我们首先检查文件是否存在,如果不存在,则返回`BadRequest`结果。如果文件存在,则使用`Path.Combine`方法创建文件的保存路径。接着,我们使用`FileStream`类创建文件流,并使用`CopyToAsync`方法从上传文件流中复制数据到指定的文件流中。最后,我们使用`Ok`方法返回上传成功的消息。请注意,我们将视频文件存储在`wwwroot`文件夹中,这是ASP.NET Core应用程序的默认静态文件目录。 当用户使用POST请求上传视频时,他们可以使用类似于以下示例的代码: ```html <form method="post" enctype="multipart/form-data" action="/api/uploadvideo"> <input type="file" name="file" /> <button type="submit">Upload Video</button> </form> ``` 在这个示例中,我们使用`enctype="multipart/form-data"`属性来指定这是一个多部分表单,以便能够上传文件。我们还使用`input`标签的`type="file"`属性来允许用户选择视频文件。最后,我们使用`action`属性来指定上传视频的API路由。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃香蕉的阿豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值