Biwen.Settings 2.5.0

dotnet add package Biwen.Settings --version 2.5.0                
NuGet\Install-Package Biwen.Settings -Version 2.5.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Biwen.Settings" Version="2.5.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Biwen.Settings --version 2.5.0                
#r "nuget: Biwen.Settings, 2.5.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Biwen.Settings as a Cake Addin
#addin nuget:?package=Biwen.Settings&version=2.5.0

// Install Biwen.Settings as a Cake Tool
#tool nuget:?package=Biwen.Settings&version=2.5.0                

Biwen.Settings

Nuget Nuget GitHub license PRs Welcome

Biwen.Settings介绍

解决程序配置项重复引用的问题,比如我们有一个GitHubSetting配置项, 我们可以在任意地方注入GitHubSetting,系统会自动将配置项注入到我们的业务代码中,并且可以在系统中动态修改配置项, 修改后会自动持久化到存储中,并通知集群的订阅子节点Setting配置项变更事件,清空缓存并重新加载持久层的最新项 案例项目:BiwenSettingsMutiNodeTest

当前仓储可以是一个抽象的概念,可以任意横向实现.比如使用多个数据库负载,或者多个Redis等.只要能保证数据一致性即可

基础案例

  • 一个简单例子 比如我有一个Web站点,这个Web站点有很多的负载,以及一一些小程序后台服务 ,
  • 这些独立的程序(或者裂变或者使用代理转发的微服务), 都使用同一个 WX账号收账,那么这些站点或者后台服务都可以是这个WX账号配置的消费节点,
  • 这些节点可以配置一个或者多个作为主节点,当任意一个主节点修改配置项时,主动通知其他子节点更新配置,并且清空配置的缓存服务并重新加载Store!

NuGet 包

  • dotnet add package Biwen.Settings

开发环境

运行环境

使用方式

[* 示例项目]

Easy to Use

Step 1

1.1 使用EntityFrameworkCore的方式

  • implements IBiwenSettingsDbContext
public class MyDbContext : DbContext, IBiwenSettingsDbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options)
        : base(options)
    {
    }

    public DbSet<Setting> Settings { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        //根据情况自定义表名
        builder.Entity<Setting>(b =>
        {
            b.ToTable("Settings");
        });
        //可以根据自己的情况约束存储列
        //builder.Entity<Setting>().Property(x => x.SettingName).HasMaxLength(500);
    }
}
1.1.1 Migration
  • Add a new Entity Framework Core migration to save your changes
dotnet ef migrations add biwenSettings
dotnet ef database update

1.2 使用自定义SettingStore

  • 直接跳入step 2.2

step 2

  • 2.1 如果使用Biwen.Settings提供的EF仓储,必须注入DBContext
builder.Services.AddDbContext<MyDbContext>(options =>
{
    //根据您的情况使用任意EFCore支持的数据库
    //当前使用内存数据库作为演示.生产环境务必修改!
    options.UseInMemoryDatabase("BiwenSettings");
});
  • 2.2 如果使用自定义仓储,请实现ISettingStore并修改AddBiwenSettings()
options.UseSettingStore<T,V>()

step 3

  • AddBiwenSettings & UseBiwenSettings
builder.Services.AddBiwenSettings(options =>
  {
//ProjectId : 项目标识 用于区分不同的项目,比如:日志系统,文件系统;或者环境,比如:开发环境,测试环境,生产环境
#if DEBUG
    options.ProjectId = $"Biwen.Settings.TestWebUI-{"Development"}";
#endif
#if !DEBUG
    options.ProjectId = $"Biwen.Settings.TestWebUI-{"Production"}";
#endif
//自定义布局
options.Layout = "~/Views/Shared/_Layout.cshtml";
options.Title = "Biwen.Settings";
//路由地址 ,http://..../system/settings
options.Route = "system/settings";
//授权规则
options.PermissionValidator = (ctx) => true;
options.EditorOptions.EditorOnclick = "return confirm('Are You Sure!?');";
options.EditorOptions.EdtiorConfirmButtonText = "Submit";
options.EditorOptions.EditorEditButtonText = "Edit";
options.EditorOptions.ShouldPagenation = true;

//开启AutoFluentValidation
options.AutoFluentValidationOption.Enable = true;

//支持缓存提供者,默认不使用缓存
options.UseCacheOfNull();
//您也可以使用Biwen.Settings提供内存缓存:MemoryCacheProvider
//options.UseCacheOfMemory();
//使用自定义缓存提供者
//options.UseCache<T>();
//配置当前服务为主节点
options.NotifyOptions.IsNotifyEnable = true;
options.NotifyOptions.Secret = "Biwen.Settings.Notify";
//子节点配置
options.NotifyOptions.EndpointHosts = new[]
{
    "http://localhost:5150"
};
//默认提供EntityFrameworkCore持久化配置项
//options.UseStoreOfEFCore<MyDbContext>();

//使用JsonStore持久化配置项
options.UserStoreOfJsonFile(options =>
{
    options.FormatJson = true;
    options.JsonPath = "systemsetting.json";
});


options.MapNotifyEndpoint = true;
options.ApiConventionBuilder = (builder) =>
{
    builder.WithTags("BiwenSettingApi").WithOpenApi();
};
        
//自行实现的ISettingStore注册
//options.UseSettingStore<T,V>()
});

//提供对`IOptions`和`IConfiguration`直接支持:
builder.Configuration.AddBiwenSettingConfiguration(builder.Services, true);

app.UseBiwenSettings();

Enjoy!

2024-05-17更新 提供对IOptions,IOptionsSnapshotIConfiguration直接支持: 帮助参见:releases 2.2.0 +

2024-11-29更新 提供对NET9.0支持!: 帮助参见:releases 2.2.0 +

支持提交更新时验证器自动验证

image image

//模拟的配置项,注意描述信息,以及默认值.初始化将以默认值为准
[Description("微信配置")]
public class WeChatSetting : SettingBase
{
    [Description("AppId")]
    public string AppId { get; set; } = "wx1234567890";

    [Description("AppSecret")]
    public string AppSecret { get; set; } = "1234567890";

    [Description("Token")]
    public string Token { get; set; } = "1234567890";

    [Description("EncodingAESKey")]
    public string EncodingAESKey { get; set; } = "1234567890";
    //排序
    public override int Order => 500;
    //定义验证器
    public class WeChatSettingValidtor : AbstractValidator<WeChatSetting>
    {
        public WeChatSettingValidtor()
        {
            //验证规则
            RuleFor(x => x.AppId).NotEmpty().Length(12, 32);
            RuleFor(x => x.AppSecret).NotNull().NotEmpty().Length(12, 128);
        }
    }
}

/// <summary>
/// 内置验证器的配置项,推荐使用这种方式 ,同时支持`FluentValidation`和`DataAnnotations`
/// </summary>
[Description("内置验证器的配置项测试")]
public class TestAutoValidSetting : ValidationSettingBase<TestAutoValidSetting>
{
    [StringLength(50, MinimumLength = 3)] // DataAnnotations支持
    public string Name { get; set; } = "Hello"!;

    public TestAutoValidSetting()
    {
        //构造函数中添加验证规则
        RuleFor(x => x.Name).NotEmpty().Length(8, 32);
    }
    override public int Order => 600;
}

//anywhere you can inject
//View:
//@inject WeChatSetting WeChatSetting;
//@inject TestAutoValidSetting TestAutoValidSetting;

//Service:
//public class MyClass
//{
//    private readonly WeChatSetting _weChatSetting;
//    private readonly TestAutoValidSetting _testAutoValidSetting;
//    public MyClass(WeChatSetting weChatSetting,TestAutoValidSetting testAutoValidSetting)
//    {
//        _weChatSetting = weChatSetting;
//        _testAutoValidSetting = testAutoValidSetting;
//    }
//}

More
  • INotify订阅配置变更
public class WeChatSettingNotify : INotify<WeChatSetting>
{
    private readonly ILogger<WeChatSettingNotify> _logger;

    public WeChatSettingNotify(ILogger<WeChatSettingNotify> logger)
    {
        _logger = logger;
    }

    public async Task Notify(WeChatSetting setting)
    {
        _logger.LogInformation("微信配置发生变更!");
        await Task.CompletedTask;
    }
}
  • Minimal API

//all settings
//GET ~/{RoutePrefix}/all

//get setting by full type name
//GET ~/{RoutePrefix}/get/{id}

//update setting by full type name
//POST ~/{RoutePrefix}/set/{id}
//body:
//{
//    "PropertyName1": "...",
//    "PropertyName2": "...",
//    "PropertyName3": "..."
//}

License

  • MIT

联系我

  • QQ:552175420
  • Email: vipwan#sina.com

项目地址

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (3)

Showing the top 3 NuGet packages that depend on Biwen.Settings:

Package Downloads
Biwen.Settings.OC

Biwen.Settings.OC ,NET8+ 应用配置项管理模块

Biwen.Settings.Caching.Garnet

Biwen.Settings ,NET8+ 应用配置项管理模块

Biwen.Settings.Redis

Biwen.Settings ,NET8+ 应用配置项管理模块

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
2.5.0 85 12/22/2024
2.4.1 89 12/18/2024
2.4.0 119 12/12/2024
2.3.0 81 11/29/2024
2.2.6.2 82 7/23/2024
2.2.5 112 6/10/2024
2.2.4 105 5/22/2024
2.1.1 113 4/8/2024
2.1.0 131 4/1/2024
2.0.3 136 3/5/2024
2.0.2 190 1/5/2024
2.0.1 145 12/28/2023
2.0.0 199 11/16/2023
2.0.0-preview1 90 9/25/2023
1.4.0 125 9/18/2023
1.3.3 158 9/14/2023
1.3.2 150 9/7/2023
1.2.2 140 9/1/2023

提供对IConfiguration和IOptions的集成支持