首页 > 编程语言 >.NET C# 配置 Options

.NET C# 配置 Options

时间:2024-07-21 10:26:42浏览次数:11  
标签:选项 return string C# 配置 Options public NET options

.NET C# 配置 Options

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

文章目录

环境 .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/swashbuckle
        builder.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

标签:选项,return,string,C#,配置,Options,public,NET,options
From: https://blog.csdn.net/szy13323042191/article/details/140550071

相关文章

  • 【C++】类和对象(中篇)
    类和对象一.类的默认成员函数二.构造函数三.析构函数四.拷贝构造函数五.运算符重载六.赋值运算符重载七.日期类的实现1.Date.h2.Date.cpp2.test.cpp八.取地址运算符重载1.const成员函数2.取地址运算符重载一.类的默认成员函数  默认成员函数就是用户不用实现的函......
  • Windows11下使用VcXsrv+xfce4实现图形化窗口
    通过sudoapt-getinstallxfce4-terminalsudoapt-getinstallxfce4sudoservicedbusrestart来安装所需要的软件包,期初我也是按部就班的通过网上搜索到的教程进行操作,例如:sudonano~/.bashrc#在末尾添加exportDISPLAY=$(grep-m1nameserver/etc/resolv.conf......
  • Autopsy Forensic Browser 是一个开源的数字取证工具,主要用于分析电脑文件系统和存储
    AutopsyForensicBrowser是一个开源的数字取证工具,主要用于分析电脑文件系统和存储设备,帮助调查人员识别和恢复可能的证据。它设计用于在调查和法医实验室中使用,支持各种操作系统,包括Windows、Linux和macOS。该工具的主要特点和功能包括:文件系统分析:可以深入分析和检查存储......
  • Chameleon:Meta推出的图文混合多模态开源模型
    目录引言一、Chameleon模型概述1、早期融合和基于token的混合模态模型1)早期融合的优势2)基于token的方法2、端到端训练二、技术挑战与解决方案1、优化稳定性问题2、扩展性问题3、架构创新4、训练技术5、稳定性和扩展性的优化6、混合模态数据的表示学习三、模型架构与优......
  • C++自学笔记1(c++原理)
    Why学习C++?因为C++直接控制硬件。C++的工作原理是:C++代码,代码交给编译器来编译,编译器将代码转换成目标平台的机器码。(机器码:你操作的设备上CPU实际执行的二进制命令)所以我们使用C++可以控制CPU上每条进程的指令。C++可以运用在哪些平台上?几乎任何平台,只要你找到对应的编译器......
  • C++自学笔记2(变量与函数)
    变量(数据)编程的本质实际上就是操纵数据,任何种类的数据。我们想对数据进行修改、读取、写入,我们将数据放在一个叫做变量的东西,他可以允许我们对数据命名。我们需要利用数据、存放数据。当我们创造一个变量时,他被存放在两个地方“堆”和“栈”(再挖个坑)在物理意义上我们的数据......
  • C++自学笔记3(头文件)
    头文件就是各个函数申明存放地(也可以放结构体)现在你有main.c文件、A.c、B.c文件A.c包含A()函数B.c包含B()函数如果想要在main.c中使用A()B()两个函数,那么我们必须在intmain()之上进行申明_________________________________________________________________________//mai......
  • Spring Resources 入门
    1.介绍Resources是Spring框架中的一个核心模块,用于处理资源文件的访问。它提供了一种方便的方式来访问不同类型的资源,如文件、类路径下的资源、网络上的资源等。Spring提供了统一的资源访问机制,使得开发者可以更加方便地操作各种资源。接下来让我们来学习关于Resource......
  • 使用.loc切片时Series为空
    我想获取Q1到Q9之间的项目。我使用.loc对系列对象进行切片:s.loc['Q1':'Q2']但是它返回一个空系列。Series([],dtype:object)通常,我应该返回['Q1','Q2','Q3','Q4','Q5','Q6','Q7'......
  • Codeforces Round 960 (Div. 2) 补题记录(A~D)
    打的稀烂,但是还是上分了(A考虑对值域做一个后缀和。若某一个后缀和的值是奇数那么先手就可以获胜。否则就不可以获胜。(我才不会告诉你我这题吃了一次罚时的)#pragmaGCCoptimize(3)#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intmysqrt(intx){......