当前位置: 首页 > news >正文

.NET C# 配置 Options

.NET C# 配置 Options

使用 options 模式可以带来许多好处,包括清晰的配置管理、类型安全、易于测试和灵活性。但在使用过程中,也需要注意配置复杂性、性能开销和依赖框架等问题。通过合理设计和使用,可以充分发挥 options 模式的优势,提高代码的可维护性和可靠性。

文章目录

  • .NET C# 配置 Options
    • 1 IConfigureOptions
      • 1.1 说明
      • 1.2 使用
    • 2 IOptionsMonitor
      • 2.1 说明
      • 2.2 使用
    • 3 IValidateOptions
      • 3.1 说明
      • 3.2 使用

环境 .NET6

1 IConfigureOptions

1.1 说明

IConfigureOptions<TOptions> 接口用于配置选项类的实例。通过实现 IConfigureOptions<TOptions> 接口,你可以在应用程序启动时对选项进行额外的配置。

IConfigureOptions<TOptions> 接口定义了一个方法 Configure,用于配置选项类的实例。其定义如下:

public interface IConfigureOptions<in TOptions> where TOptions : class
{void Configure(TOptions options);
}
优点说明
集中配置可以在一个地方集中配置选项,避免在多个地方重复配置。
动态配置可以根据运行时条件动态配置选项。
分离关注点将配置逻辑与业务逻辑分离,提高代码的可维护性。
易于测试可以单独测试配置逻辑,确保配置的正确性。
缺点
增加复杂性对于简单配置场景,使用 IConfigureOptions<TOptions> 可能会增加额外的复杂性。
配置顺序依赖配置的顺序可能会影响最终的配置结果,需要注意配置的执行顺序。

1.2 使用

配置类:

public class SettingsBase
{public override string ToString(){return string.Join(Environment.NewLine, this.GetType().GetProperties().Select(p =>{if (p.GetValue(this, null) is IList list){return p.Name + " = " + string.Join(", ", list.Cast<object>());}return p.Name + " = " + p.GetValue(this, null);}));}
}public class TestSettings : SettingsBase
{public string StringSetting { get; set; }public int IntSetting { get; set; }public bool BoolSetting { get; set; }public double DoubleSetting { get; set; }public DateTime DateTimeSetting { get; set; }public List<string> ListSetting { get; set; }
}

配置器:

public class TestSettingsConfigurator : IConfigureOptions<TestSettings>
{public void Configure(TestSettings options){options.BoolSetting = true;options.DateTimeSetting = DateTime.Now;options.DoubleSetting = 0.123456789;options.IntSetting = 123456789;options.ListSetting = new List<string> { "Item1", "Item2", "Item3" };options.StringSetting = "Test String";}
}

依赖注入:

public class Program
{public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();// 注册配置器builder.Services.AddSingleton<IConfigureOptions<TestSettings>, TestSettingsConfigurator>();var app = builder.Build();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){app.UseSwagger();app.UseSwaggerUI();}app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();}
}

控制器:

[Route("api/[controller]")]
[ApiController]
public class ConfigsController : ControllerBase
{private readonly IOptions<TestSettings> _testSettingsOptions;private readonly ILogger<ConfigsController> _logger;public ConfigsController(ILogger<ConfigsController> logger, IOptions<TestSettings> testConfigureOptions){_testSettingsOptions = testConfigureOptions;_logger = logger;}[HttpGet("GetConfig")]public IActionResult GetConfig(){return Ok(_testSettingsOptions.Value);}
}

测试:

image-20240719142932647

2 IOptionsMonitor

2.1 说明

IOptionsMonitor<TOptions> ,用于监控选项更改并提供选项的即时快照。它的主要作用是提供一种方法来在选项值更改时得到通知,并且在应用程序运行时获取当前的选项值。

//
// 摘要:
//     用于在选项实例更改时通知。
//
// 类型参数:
//   TOptions:
//     选项类型。
public interface IOptionsMonitor<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] out TOptions>
{//// 摘要://     使用Microsoft.Extensions.Options.Options.DefaultName返回当前的options实例。TOptions CurrentValue { get; }//// 摘要://     返回具有给定名称的配置的TOptions实例。TOptions Get(string name);//// 摘要://     注册一个监听器,当命名选项发生变化时调用。//// 参数://   listener://     当选项发生变化时调用的操作。//// 返回结果://     一个可销毁对象,以停止监听变化。IDisposable OnChange(Action<TOptions, string> listener);
}

IOptionsMonitor<TOptions> 提供以下功能:

  1. 获取当前值:可以获取选项的当前值。
  2. 变更通知:当选项值更改时,可以订阅通知。

IOptionsMonitor<TOptions> 应用场景:

  • 需要在运行时动态更新配置。
  • 需要对配置的变化进行响应。

2.2 使用

控制器:

[HttpGet("GetMonitorConfig")]
public IActionResult GetMonitorConfig()
{return Ok(_testSettingsMonitor.CurrentValue);
}

测试:

image-20240719144542637

3 IValidateOptions

3.1 说明

IValidateOptions<TOptions> ,用于验证选项值的有效性。通过实现这个接口,你可以确保配置的值符合预期的规则和约束,在应用程序启动时或配置变更时进行验证。IValidateOptions<TOptions> 接口定义了一种方法,用于验证选项实例的值,并返回验证结果。它提供了一种集中管理选项验证逻辑的方式。

public interface IValidateOptions<TOptions> where TOptions : class
{//// 摘要://     验证指定的命名选项实例(当name为null时,验证全部)。//// 参数://   name://     正在验证的选项实例的名称。////   options://     options实例。//// 返回结果://     Microsoft.Extensions.Options.ValidateOptionsResult 结果。ValidateOptionsResult Validate(string name, TOptions options);
}

3.2 使用

验证器:

public class TestSettingsValidator : IValidateOptions<TestSettings>
{public ValidateOptionsResult Validate(string? name, TestSettings options){if (string.IsNullOrEmpty(options.StringSetting)){return ValidateOptionsResult.Fail("StringSetting cannot be null or empty.");}if (options.DoubleSetting >= 1){return ValidateOptionsResult.Fail("DoubleSetting must be greater than 1.");}return ValidateOptionsResult.Success;}
}

依赖注入:

builder.Services.AddSingleton<IValidateOptions<TestSettings>, TestSettingsValidator>();

测试:

202407191458490

相关文章:

  • Centos7_Minimal安装Cannot find a valid baseurl for repo: base/7/x86_6
  • 代码随想录第五十九天 | 115.不同的子序列,583. 两个字符串的删除操作, 72. 编辑距离
  • 自学Java第11Day
  • LLM推理优化
  • 深度学习 —— 个人学习笔记6(权重衰减)
  • 价格战再起:OpenAI 发布更便宜、更智能的 GPT-4o Mini 模型|TodayAI
  • 前端设计模式面试题汇总
  • c++ primer plus 第16章string 类和标准模板库, 泛型编程----为何使用迭代器
  • 面试题 33. 二叉搜索树的后序遍历序列
  • GD32 MCU上电跌落导致启动异常如何解决
  • 《简历宝典》18 - 简历中“技术能力”,如何丰满且有层次,Java篇
  • MySQL简介以及对数据库的操作
  • 力扣 102题 二叉树的层次遍历 记录
  • CSS 中border-radius 属性
  • 学习并测试SqlSugar的单库事务功能
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • HTTP请求重发
  • laravel5.5 视图共享数据
  • Python十分钟制作属于你自己的个性logo
  • Travix是如何部署应用程序到Kubernetes上的
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 坑!为什么View.startAnimation不起作用?
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 如何用vue打造一个移动端音乐播放器
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 延迟脚本的方式
  • 一个完整Java Web项目背后的密码
  • Hibernate主键生成策略及选择
  • ​iOS实时查看App运行日志
  • ​Java基础复习笔记 第16章:网络编程
  • #define、const、typedef的差别
  • #Z2294. 打印树的直径
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四) Graphivz 颜色选择
  • (转)EXC_BREAKPOINT僵尸错误
  • (轉)JSON.stringify 语法实例讲解
  • .htaccess配置常用技巧
  • .net 4.0发布后不能正常显示图片问题
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net Core 中间件与过滤器
  • .net mvc部分视图
  • .NET 的程序集加载上下文
  • .Net 知识杂记
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET6 命令行启动及发布单个Exe文件
  • .net开发引用程序集提示没有强名称的解决办法
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @AliasFor 使用
  • @angular/cli项目构建--Dynamic.Form
  • [ A*实现 ] C++,矩阵地图