HZY.Framework.Core
10.1.19
dotnet add package HZY.Framework.Core --version 10.1.19
NuGet\Install-Package HZY.Framework.Core -Version 10.1.19
<PackageReference Include="HZY.Framework.Core" Version="10.1.19" />
<PackageVersion Include="HZY.Framework.Core" Version="10.1.19" />
<PackageReference Include="HZY.Framework.Core" />
paket add HZY.Framework.Core --version 10.1.19
#r "nuget: HZY.Framework.Core, 10.1.19"
#:package HZY.Framework.Core@10.1.19
#addin nuget:?package=HZY.Framework.Core&version=10.1.19
#tool nuget:?package=HZY.Framework.Core&version=10.1.19
HZY.Framework
模块化 .NET 10 插件框架:AOP、依赖注入、EF Core 仓储、动态 API 控制器、定时任务、Redis、服务器监控。
- 源码与完整文档:https://gitee.com/hzy6/HZY.Framework
- 完整实战案例(HzyAdmin 后台管理系统):https://gitee.com/hzy6/HzyAdmin
包清单
| 包 | 说明 |
|---|---|
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 | Versions 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. |
-
net10.0
- DependencyInjection.StaticAccessor.Hosting (>= 10.0.0)
- HZY.Framework.Aop (>= 10.1.19)
- Newtonsoft.Json (>= 13.0.4)
- Rougamo.Fody (>= 5.0.2)
- Scrutor (>= 7.0.0)
- StackExchange.Redis (>= 3.2.0)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on HZY.Framework.Core:
| Package | Downloads |
|---|---|
|
HZY.Framework.Authentication
HZY.Framework 标准化 JWT Bearer 认证包:Options 驱动配置、启动期安全校验、统一 401/403 JSON 响应 ===== 使用教程 ===== 1、配置(appsettings.json,节名默认 HzyJwt): "HzyJwt": { "Issuer": "hzy-admin", "Audience": "hzy-admin-web", "SigningKey": "至少32字符的高熵随机密钥(生产环境务必更换并通过环境变量注入)", "ValidateIssuer": true, "ValidateAudience": true, "ValidateLifetime": true, "ClockSkewSeconds": 60, "RequireHttpsMetadata": true } 2、注册服务(启动模块 ConfigureServices 中): builder.Services.AddHzyJwtAuthentication(builder.Configuration.GetSection("HzyJwt")); // 或 WebApplicationBuilder 便捷重载: // builder.AddHzyJwtAuthentication(); // 注册基于权限的授权(可选,见 HZY.Framework.Web.Security 包): // builder.Services.AddHzyPermissionAuthorization(); 3、接入管线(启动模块 Configure 中,认证必须在授权之前): app.UseHzyAuthentication(); // 等价 UseAuthentication(),幂等 + 管线顺序诊断 app.UseAuthorization(); 4、统一响应:401/403 返回与框架 ApiResult 同构的 JSON,并携带机器可读错误码: // 401 {"code":401,"errorMessage":"未登录或登录过期","data":{"errorCode":"unauthorized"}} // 401(过期)data.errorCode = "token_expired";403 data.errorCode = "forbidden" // 需要自定义信封(如下游系统已有前端协议)时: // o.WriteResponseAsync = (ctx, status, errorCode, message) => ...; 5、签发辅助(可选、显式调用;框架不做登录业务): var token = new HzyJwtTokenBuilder(jwtOptions) .WithSubject(Guid.NewGuid().ToString()) .WithClaim(ClaimTypes.Role, "admin") .CreateToken(TimeSpan.FromHours(1)); 安全默认:签名校验不可关闭;SigningKey 缺失/过短(<32 字符)启动期快速失败, 生产环境额外拒绝明显默认值;错误信息不回显 SigningKey 与 Token 原文。 源码与完整文档:https://gitee.com/hzy6/HZY.Framework 实战案例(HzyAdmin):https://gitee.com/hzy6/HzyAdmin |
|
|
HZY.Framework.Web.Security
HZY.Framework Web 安全基线包:权限授权([RequirePermission])、端点白名单、CORS、安全响应头、 ForwardedHeaders、分区限流、liveness/readiness 健康检查。全部能力显式 opt-in,未调用不改变任何现有行为。 ===== 使用教程 ===== 1、权限授权(配合 HZY.Framework.Authentication 的 JWT 使用): builder.Services.AddHzyPermissionAuthorization(); // 自定义权限校验器(默认 DenyAllPermissionChecker 安全拒绝,绝不放行): builder.Services.AddHzyPermissionChecker<MyPermissionChecker>(); [RequirePermission("system:user:read")] // 单权限 [RequirePermission("system:user:read", "system:user:write")] // 任意命中一个即通过 [RequireAllPermissions("a", "b")] // 必须全部拥有 [AllowAnonymous] // 始终优先 public Task<object> GetAsync() { ... } // 全站默认要求登录 + 匿名路径白名单(可选): builder.Services.AddHzyPermissionAuthorization(o => { o.RequireAuthenticatedUserByDefault = true; o.AnonymousPaths.AddRange(["/health/", "/swagger/", "/api/v1/identity/"]); }); 2、Web 安全基线(CORS / 安全响应头 / ForwardedHeaders / 限流 / 健康检查,全部默认关闭,逐项开启): builder.AddHzyWebSecurity(o => { o.Cors.Enabled = true; o.Cors.AllowedOrigins.AddRange(["https://admin.example.com"]); o.Headers.Enabled = true; // nosniff / X-Frame-Options / Referrer-Policy / CSP o.Headers.EnableHsts = true; // 生产环境建议开启 o.ForwardedHeaders.Enabled = true; // 反向代理场景显式开启(仅信任显式配置的代理网段) o.ForwardedHeaders.KnownNetworks.Add("10.0.0.0/8"); o.RateLimiting.Enabled = true; // 基于 Core AddFrameworkRateLimiter 的分区扩展 o.HealthChecks.Enabled = true; // /health/live + /health/ready(readiness 按 tag 过滤) }); 3、接入管线(顺序:ForwardedHeaders -> CORS -> 安全头 -> 认证 -> 授权 -> 限流 -> Endpoint): app.UseHzyWebSecurity(); // 按配置挂载 ForwardedHeaders/CORS/安全头并映射健康检查 app.UseHzyAuthentication(); // HZY.Framework.Authentication app.UseAuthorization(); app.UseHzyRateLimiter(); // 限流(用户分区需在认证之后) 安全默认:CORS 默认拒绝且禁止 AllowAnyOrigin+AllowCredentials;ForwardedHeaders 不开启则不信任 X-Forwarded-*(开启后默认仅信任回环,需显式配置受信代理网段);健康检查默认仅返回聚合状态。 源码与完整文档:https://gitee.com/hzy6/HZY.Framework 实战案例(HzyAdmin):https://gitee.com/hzy6/HzyAdmin |
|
|
HZY.Framework.Observability
HZY.Framework 标准化全链路可观测性基线包:请求关联(CorrelationId)+ Activity 追踪 + 日志 scope, 低侵入、默认安全、可关闭。不绑定任何 OpenTelemetry exporter。 ===== 使用教程 ===== 1、配置(appsettings.json,节名默认 "HzyObservability"): "HzyObservability": { "CorrelationIdHeader": "X-Correlation-ID", // 关联 ID 请求/响应头 "AcceptClientCorrelationId": false, // 默认拒绝客户端伪造的关联 ID,自动生成新值 "MaxCorrelationIdLength": 64, // 客户端 ID 最大长度(超过视为非法并忽略) "WriteToResponseHeader": true, // 响应头回传关联 ID(前端/网关可透传) "EnableActivity": true, // 通过 ActivitySource 建立 server span(遵循 W3C traceparent) "EnableLogScope": true // 建立 ILogger scope(CorrelationId/TraceId/Method/Path) } 2、注册与管线(启动模块中;位置:ForwardedHeaders 之后、CORS/Authentication 之前): builder.Services.AddHzyObservability(builder.Configuration); app.UseHzyObservability(); // 幂等,重复调用只挂载一次 3、业务/HttpClient 共用同一 ActivitySource(可选): ActivitySource source = HzyObservability.ActivitySource; // 全局共享源 using var activity = source.StartActivity("order-process"); // 与请求同链路 4、与 OpenTelemetry 集成(可选,本包不依赖也不内置 exporter): // 宿主自行安装 OpenTelemetry 包后,把本包的 ActivitySource 注册进导出管线即可: builder.Services.AddOpenTelemetry() .WithTracing(t => t.AddSource(HzyObservability.ActivitySourceName)); 安全默认:不采纳客户端伪造 ID;关联 ID 只含安全字符;不记录 Authorization/Cookie/请求体等敏感信息; 日志 scope 仅含 CorrelationId/TraceId/RequestMethod/RequestPath。 源码与完整文档:https://gitee.com/hzy6/HZY.Framework 实战案例(HzyAdmin):https://gitee.com/hzy6/HzyAdmin |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on HZY.Framework.Core:
| Repository | Stars |
|---|---|
|
hzy-6/hzy-admin
前后端分离权限管理系统基架! 数据权限、按钮权限、动态菜单、动态任务调度、动态WebApi、定时标记 [Scheduled("0/5 * * * * ?")] 、代码生成
|
| Version | Downloads | Last Updated |
|---|---|---|
| 10.1.19 | 307 | 9/11/2026 |
| 10.1.18 | 230 | 8/19/2026 |
| 10.1.17 | 125 | 8/18/2026 |
| 10.1.16 | 113 | 8/18/2026 |
| 10.1.15 | 111 | 8/13/2026 |
| 10.1.14 | 113 | 8/13/2026 |
| 10.1.10 | 117 | 8/6/2026 |
| 10.1.9 | 108 | 8/5/2026 |
| 10.1.8 | 122 | 8/3/2026 |
| 10.1.7 | 113 | 8/3/2026 |
| 10.1.6 | 118 | 8/3/2026 |
| 10.1.5 | 124 | 8/3/2026 |
| 10.1.4 | 115 | 8/3/2026 |
| 10.1.3 | 114 | 8/3/2026 |
| 10.1.2 | 185 | 8/3/2026 |
| 10.1.1 | 207 | 8/3/2026 |
| 10.0.13 | 149 | 4/4/2026 |
| 10.0.12 | 157 | 3/18/2026 |
| 10.0.11 | 146 | 3/1/2026 |
| 10.0.9 | 127 | 3/1/2026 |