HZY.Framework.DynamicApiController 10.1.19

dotnet add package HZY.Framework.DynamicApiController --version 10.1.19
                    
NuGet\Install-Package HZY.Framework.DynamicApiController -Version 10.1.19
                    
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="HZY.Framework.DynamicApiController" Version="10.1.19" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="HZY.Framework.DynamicApiController" Version="10.1.19" />
                    
Directory.Packages.props
<PackageReference Include="HZY.Framework.DynamicApiController" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add HZY.Framework.DynamicApiController --version 10.1.19
                    
#r "nuget: HZY.Framework.DynamicApiController, 10.1.19"
                    
#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.
#:package HZY.Framework.DynamicApiController@10.1.19
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=HZY.Framework.DynamicApiController&version=10.1.19
                    
Install as a Cake Addin
#tool nuget:?package=HZY.Framework.DynamicApiController&version=10.1.19
                    
Install as a Cake Tool

HZY.Framework

模块化 .NET 10 插件框架:AOP、依赖注入、EF Core 仓储、动态 API 控制器、定时任务、Redis、服务器监控。

包清单

说明
HZY.Framework.Aop AOP 拦截器基类(Rougamo 编译期静态织入,无动态代理、无性能损耗)
HZY.Framework.Core 核心主干:AOP、DI 特性注册、启动模块、定时任务、Redis、服务器指标监控
HZY.Framework.Caching 独立缓存扩展:[Cacheable]/[CacheEvict] 方法级缓存、ICacheProvider 抽象(可扩展分布式)、标签批量失效、single-flight 防击穿
HZY.Framework.Authentication 标准化 JWT Bearer 认证:Options 驱动 + 启动期安全校验 + 统一 401/403 JSON(含 token_expired 等机器可读错误码)
HZY.Framework.Observability 全链路可观测性基线:CorrelationId(默认拒绝伪造)+ W3C traceparent 延续的 server Activity + 日志 scope,共享 ActivitySource,不绑定 OTEL exporter
HZY.Framework.Web.Security Web 安全基线:[RequirePermission]/IPermissionChecker 权限授权、CORS、安全响应头、ForwardedHeaders、分区限流、liveness/readiness 健康检查
HZY.Framework.Repository.EntityFramework EF Core 泛型仓储:软删除、审计字段、雪花 ID、分表、字段加密、事务、批量操作
HZY.Framework.Repository.EntityFramework.{SqlServer/MySql/PostgreSql/Oracle/Sqlite} 数据库 Provider(按需选装)
HZY.Framework.Repository.EntityFramework.All 全部数据库 Provider 聚合包
HZY.Framework.DynamicApiController 服务类自动映射为 HTTP API 控制器

快速开始

// 1. 定义启动模块(可组合多个模块,按 Order 排序执行)
[ImportStartupModule(typeof(RepositoryStartupModule))]
public class AppStartup : StartupModule<AppStartup>
{
    public override void ConfigureServices(WebApplicationBuilder builder)
    {
        // 动态 API 控制器:实现 IDynamicApiController 的服务自动注册为控制器
        builder.Services.AddControllers().AddDynamicApiController();

        // 扫描 [Component] 特性自动注册服务
        builder.Services.AddDependencyInjectionByComponent([typeof(Program).Assembly]);
    }
}

// 2. Program.cs —— 一行启动
var builder = WebApplication.CreateSlimBuilder(args);
HzyApplication.Run<AppStartup>(builder);

功能速查(AI 友好索引)

依赖注入

[Component]                                              // 默认 Transient
[Component(ServiceLifetime.Scoped)]                      // 指定生命周期
[Component(typeof(IUserService), ServiceLifetime.Singleton)] // 指定接口注册
public class UserService : IUserService { }

public class OrderService
{
    [Autowired]                                          // 属性注入(AOP 拦截 get)
    public IUserService UserService { get; set; } = null!;
}

注册入口:services.AddDependencyInjectionByComponent([typeof(Program).Assembly])

AOP 拦截器

自定义拦截器继承 AopMoAttribute(基于 Rougamo.Fody 编译期织入,零运行时代理):

public class LogAttribute : AopMoAttribute
{
    public override void OnEntry(MethodContext context) { /* 方法进入 */ }
    public override void OnSuccess(MethodContext context) { /* 方法成功 */ }
    public override void OnException(MethodContext context) { /* 方法异常 */ }
    public override void OnExit(MethodContext context) { /* 方法退出(重写时必须调 base) */ }
}

// 内置拦截器
[Time]                                                   // 记录方法耗时日志
[MemoryCache(CacheKey = "user:{id}", CacheDuration = 60)] // 内存缓存(秒,0=永久)

方法缓存(HZY.Framework.Caching 独立包)

声明式方法缓存 + 可扩展分布式提供者;标签版本号批量失效(O(1),不扫描缓存);single-flight 防击穿:

// 1. 注册(启动模块中,重复调用幂等)
builder.Services.AddHzyCaching();
// 或切换自定义分布式提供者:builder.Services.AddHzyCaching(o => o.DefaultProviderName = "Redis");

// 2. 方法缓存:显式 Key 模板支持 {参数} 与 {参数.属性};未设置 Key 时按"方法全名+签名+参数值"生成
[Cacheable(Key = "member:{id}", ExpirationSeconds = 300)]
public virtual Task<Member?> GetMemberAsync(long id) { ... }

[Cacheable(Tags = new[] { "member-list" })]              // 打标签,支持批量失效
public virtual List<Member> GetMembers(string kw) { ... }

// 3. 缓存清理:精确 Key + 标签批量失效(递增标签版本号即让整组键不可达)
[CacheEvict(Keys = new[] { "member:{id}" }, Tags = new[] { "member-list" })]
public virtual Task UpdateMemberAsync(long id, Member m) { ... }

// 4. 非 AOP 场景异步门面(全异步 I/O,同样支持标签与 single-flight)
var member = await cacheService.GetOrCreateAsync("member:1", () => LoadAsync(1), tags: ["member-list"]);

// 5. 扩展分布式:实现 ICacheProvider(含标签版本读写),注册后切换 DefaultProviderName

默认不缓存 null / 空集合(防穿透,可通过 CacheNullValues / CacheEmptyCollections 开启);方法异常不写缓存。

执行模型:异步方法(Task/Task<T>)上的拦截为真异步(缓存读写与 single-flight 等待均为 await,不阻塞线程,支持网络型提供者);同步方法上的拦截钩子为同步执行,要求提供者 IsSynchronous = true(如内存提供者),网络型提供者会抛 NotSupportedException —— 此时请改用异步方法或 ICacheService 异步 API。ICacheService 与 AOP 特性按 CachingOptions.DefaultProviderName 从全部已注册的 ICacheProvider 中解析同一提供者,与注册顺序无关。

EF Core 仓储

// 注册(MySql 为例,其他数据库换对应 Provider 包)
builder.AddRepository<AppDbContext>(new RepositoryOptions
{
    DefaultDatabaseType = DefaultDatabaseType.MySql,
    ConnectionString = builder.Configuration.GetConnectionString("Default")!
});

// 使用:任意服务构造函数注入 IRepository<T>
public class MemberService(IRepository<Member> memberRepository)
{
    // 查询(软删除自动过滤)
    var page = await memberRepository.Queryable
        .WhereIf(!string.IsNullOrWhiteSpace(keyword), w => w.Name.Contains(keyword))
        .ToPageAsync(1, 20);

    // 增删改(雪花 ID、审计字段自动填充,[Transactional] 事务保护)
    await memberRepository.InsertAsync(entity);
    await memberRepository.UpdateAsync(entity);
    await memberRepository.DeleteByIdAsync(id);          // 软删除:改写为 UPDATE
}

实体特性(标记在属性上即生效,无需配置):

特性 作用
[TableId(IdType.SnowflakeId)] 主键自动生成:雪花 ID / UUID / UUID 字符串
[TableLogic] 软删除:查询自动过滤 + 删除改写为 UPDATE
[TableField(TableFieldFill.CreateTime)] 审计字段自动填充:CreateTime / CreateId / UpdateTime / UpdateId / DeleteTime / DeleteId
[TableName(NameRuleType.SnakeCase)] 表名/字段命名规则(蛇形命名 SysFunction → sys_function)
[Dict("dict_code")] 数据字典映射
[TableFieldEncrypt] 字段透明加解密

方法级特性:

[Transactional]                                          // 事务(支持嵌套复用、多 DbContext)
[Transactional(typeof(AppDbContext), typeof(OtherDbContext))] // 多库事务
public async Task CreateOrderAsync(Order order) { ... }

动态 API 控制器

// 实现该接口(或标记 [DynamicApiController])→ 自动注册为控制器
// 路由 kebab-case,方法名前缀推断 HTTP 方法(Get*/Query*→GET,Add*/Create*→POST,...)
public class MemberAppService : IDynamicApiController
{
    public async Task<List<MemberDto>> GetListAsync(string? keyword) { ... }
    // → GET /member/list?keyword=xxx  (具体规则可配)
}

定时任务

[Component]
public class JobService
{
    [Scheduled("0/5 * * * * ?")]                          // 每 5 秒(Quartz Cron)
    public void SyncData() { ... }
}

全局服务网关

App.Services                  // IServiceCollection
App.ServiceProvider           // IServiceProvider(根容器)
App.HttpContext               // 当前 HttpContext
App.CreateScope()             // 创建服务作用域
App.GetJobTaskInfoList()      // 定时任务信息

认证授权与 Web 安全基线(Authentication / Web.Security 独立包)

// 1. JWT 认证(配置节 "HzyJwt":Issuer/Audience/SigningKey/ClockSkewSeconds/RequireHttpsMetadata...)
builder.Services.AddHzyJwtAuthentication(builder.Configuration.GetSection("HzyJwt"));

// 2. 权限授权:未注册 checker 时默认安全拒绝(DenyAll),绝不放行
builder.Services.AddHzyPermissionAuthorization()
    .AddHzyPermissionChecker<MyPermissionChecker>(); // 业务权限校验器(如查角色/菜单/API 权限表)

[RequirePermission("system:user:read")]                    // 单权限
[RequirePermission("system:user:read", "system:user:write")] // 任一命中(OR)
[RequireAllPermissions("a", "b")]                          // 全部满足(AND)
[AllowAnonymous]                                           // 始终优先

// 3. Web 安全基线(CORS/安全头/ForwardedHeaders/限流/健康检查,全部默认关闭,逐项开启)
builder.AddHzyWebSecurity(o =>
{
    o.Cors.Enabled = true;                              // 默认拒绝跨域;必须显式 Origin 白名单
    o.Cors.AllowedOrigins.AddRange(["https://admin.example.com"]);
    o.Headers.Enabled = true;                           // nosniff/XFO/Referrer-Policy/CSP,可按路径排除
    o.ForwardedHeaders.Enabled = true;                  // 反向代理场景:仅信任显式配置的代理网段
    o.ForwardedHeaders.KnownNetworks.Add("10.0.0.0/8");
    o.RateLimiting.Enabled = true;                      // 复用 Core AddFrameworkRateLimiter 的 IP/用户/路径分区
    o.HealthChecks.Enabled = true;                      // /health/live + /health/ready(readiness 按 tag)
});

// 4. 管线(顺序有启动期诊断;重复调用幂等)
app.UseHzyWebSecurity();     // ForwardedHeaders → CORS → 安全头 + 健康检查端点
app.UseHzyAuthentication();
app.UseAuthorization();
app.UseHzyRateLimiter();

// 401/403 统一 JSON(与 ApiResult 同构):
// {"code":401,"errorMessage":"令牌已过期,请重新登录","data":{"errorCode":"token_expired"}}
// 自有前端协议可通过 HzyJwtOptions.WriteResponseAsync 钩子适配

安全默认:签名校验不可关闭;SigningKey ❤️2 字符或生产环境使用示例密钥 → 启动期快速失败(错误信息不回显密钥); AllowAnyOrigin + AllowCredentials → 启动期抛异常;ForwardedHeaders 未开启不信任伪造 X-Forwarded-*; 健康检查默认只返回聚合状态;429 限流响应为统一 ApiResult JSON(多实例部署需自行接入分布式限流 provider)。

可观测性基线(HZY.Framework.Observability 独立包)

// 1. 配置节 "HzyObservability":CorrelationIdHeader/AcceptClientCorrelationId(false)/
//    MaxCorrelationIdLength(64)/WriteToResponseHeader(true)/EnableActivity(true)/EnableLogScope(true)
builder.Services.AddHzyObservability(builder.Configuration);

// 2. 管线:ForwardedHeaders 之后、CORS/Authentication 之前
app.UseHzyObservability();

// 3. 业务/HttpClient 共用同一 ActivitySource
using var activity = HzyObservability.ActivitySource.StartActivity("order-process");

// 4. 可选 OTEL 导出(本包零默认网络副作用):AddSource(HzyObservability.ActivitySourceName)

更多文档

完整功能说明、数据库 Provider 配置、读写分离、分表、并发控制、服务器监控等,见仓库 README: https://gitee.com/hzy6/HZY.Framework

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

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on HZY.Framework.DynamicApiController:

Repository Stars
hzy-6/hzy-admin
前后端分离权限管理系统基架! 数据权限、按钮权限、动态菜单、动态任务调度、动态WebApi、定时标记 [Scheduled("0/5 * * * * ?")] 、代码生成
Version Downloads Last Updated
10.1.19 37 9/11/2026
10.1.18 144 8/19/2026
10.1.17 95 8/18/2026
10.1.16 102 8/18/2026
10.1.15 99 8/13/2026
10.1.14 93 8/13/2026
10.1.10 103 8/6/2026
10.1.9 95 8/5/2026
10.1.8 111 8/3/2026
10.1.7 109 8/3/2026
10.1.6 111 8/3/2026
10.1.5 124 8/3/2026
10.1.4 104 8/3/2026
10.1.3 107 8/3/2026
10.1.2 105 8/3/2026
10.1.1 117 8/3/2026
10.0.13 145 4/4/2026
10.0.12 167 3/18/2026
10.0.11 136 3/1/2026
10.0.9 128 3/1/2026
Loading failed