Healnet.Common 4.0.10

dotnet add package Healnet.Common --version 4.0.10
                    
NuGet\Install-Package Healnet.Common -Version 4.0.10
                    
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="Healnet.Common" Version="4.0.10" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Healnet.Common" Version="4.0.10" />
                    
Directory.Packages.props
<PackageReference Include="Healnet.Common" />
                    
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 Healnet.Common --version 4.0.10
                    
#r "nuget: Healnet.Common, 4.0.10"
                    
#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 Healnet.Common@4.0.10
                    
#: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=Healnet.Common&version=4.0.10
                    
Install as a Cake Addin
#tool nuget:?package=Healnet.Common&version=4.0.10
                    
Install as a Cake Tool

Healnet.Common 通用模块

版本: v4.0.9 | TFM: net10.0 | 独立引用(零上层依赖) | NuGet: Healnet.Common 4.0.9

概述

Healnet.Common 是 Healnet 微服务框架的基础通用工具类库,提供跨项目共享的加密工具、JSON 序列化、分布式 ID 生成、扩展方法、DTO 基类、文件/Excel/Pdf 处理、Mapster 映射与 FluentValidation 验证等功能。作为整个框架的底层依赖(被 Core、Infrastructure 以及业务服务引用),Common 不引用任何上层模块,仅依赖少量通用 NuGet 包。

⚠️ 历史变更(工具类合并):原 StringHelper、DateHelper、DateTimeHelper、CollectionHelper、EncryptionHelper、ReflectionHelper、ConfigurationHelper 等静态助手类已删除,其功能已并入对应的扩展方法类(StringExtensions / DateTimeExtensions / CollectionExtensions)或现有 Helper。请勿在新代码中引用这些已删除的类。

核心特性

  • ✅ 加密工具 - CryptoHelper(PBKDF2 哈希、AES/RSA)、AESCrypto(AES 加解密)
  • ✅ JSON 序列化 - JsonHelper(System.Text.Json 封装:序列化/反序列化/克隆/合并/格式化)
  • ✅ 雪花 ID - IdGeneratorFactory + SnowflakeIdGenerator(分布式唯一 ID)
  • ✅ 扩展方法 - StringExtensions / ObjectExtensions / DateTimeExtensions / CollectionExtensions
  • ✅ DTO 基类 - BaseDto / AuditableDto / PaginationDto
  • ✅ 文件存储 - IFileService / FileServiceBase / LocalFileService / OssFileService(抽象)+ ExcelService(ClosedXML)/ PdfService(QuestPDF)
  • ✅ Mapster 映射 - MapsterExtensions
  • ✅ FluentValidation - FluentValidationExtensions + ValidationService
  • ✅ 业务枚举 - BusinessEnums
  • ✅ 应用常量 - AppConstants(缓存键、HTTP 头、Claim 类型、日期格式、错误消息)
  • ✅ 集成事件 - IntegrationEvent
  • ✅ 网络/随机/验证/环境工具 - NetworkHelper / RandomHelper / ValidationHelper / EnvironmentHelper / ServiceAddressHelper

核心组件

1. 工具类 (Helpers) — 命名空间 Healnet.Common.Helpers

类 说明
CryptoHelper 密码哈希(HashPassword/VerifyPassword,PBKDF2 + 随机盐)、AES/RSA 加解密、GenerateRandomString/GenerateGuid/GenerateTimestamp/GenerateToken、MD5/SHA256/SHA512
AESCrypto AES 对称加解密。⚠️ 密钥不再内置:AESEncrypt(plain, key) / AESDecrypt(cipher, key) → (bool Ok, string? Result),调用方必须显式传入密钥(建议从配置读取);解密失败返回 (false, null) 以便区分“解密失败”与“空结果”。⚠️ 旧式 Rijndael 实现,后续将与 CryptoHelper 合并
JsonHelper Serialize/SerializeIndented/Deserialize(×3)/SerializeToBytes/Parse/Clone/Merge/Format/Minify/IsValid
IdGeneratorFactory + SnowflakeIdGenerator + IIdGenerator + SnowflakeOptions 雪花算法分布式 ID:IdGeneratorFactory.Default / NewId() / Create(workerId, datacenterId)
NetworkHelper 本机 IP(IPv4/IPv6)/MAC、主机名/域名、DNS 解析、端口占用检测(IsPortInUse/FindAvailablePort/TestPort)、Ping、网络接口信息
RandomHelper Next/NextDouble/NextBoolean/NextString/NextNumericString/NextEmail/NextIdCard/NextFromList 等(非密码学安全,适合测试/模拟数据)
ValidationHelper IsValidEmail/IsValidPhone/IsValidUrl/IsValidGuid/IsValidIpAddress/IsValidPort/IsValidPassword/IsValidIdCard/IsValidChineseName/IsValidBankCard/IsValidCreditCard/IsValidHexColor/IsValidDateTime/IsValidJson/IsValidXml/IsValidHtml
EnvironmentHelper 环境变量读写、运行环境识别(IsDevelopment/Staging/Production)、OS/进程/架构信息、临时目录、运行时版本
ServiceAddressHelper K8s/Docker/本地环境服务地址解析(GetServiceAddress/GetServiceUrl/GetHealthCheckUrl/GetServiceId),支持 IsKubernetesEnvironment/IsDockerEnvironment

2. 扩展方法 (Extensions) — 命名空间 Healnet.Common.Extensions

类 扩展类型 说明
StringExtensions string 判空(IsNullOrEmpty/IsNullOrWhiteSpace/HasValue)、安全裁剪、类型转换(ToIntSafe/ToLongSafe/ToDateTimeSafe)、大小写安全转换、Contains/StartsWith/EndsWithIgnoreCase、IsEmail/IsPhoneNumber/IsIdCard/IsUrl/IsGuid、HTML 标签移除、ToSlug/ToSnakeCase/ToKebabCase/ToPascalCase/ToCamelCase、遮罩(Mask/MaskEmail/MaskPhone)、FormatWith、SplitTrim、JoinStrings、数值判断(IsNumeric/IsInteger/IsDecimal)、ReplaceIgnoreCase/RemoveDiacritics/RemoveExtraSpaces/Capitalize/CapitalizeEachWord/EqualsIgnoreCase/SubstringSafe
ObjectExtensions object? IsNull/IsNotNull、As<T>/ConvertTo<T>、ToJson/FromJson、ToQueryString、HasProperty/GetPropertyValue/SetPropertyValue、ToDictionary、GetTypeName、IsDefault<T>
DateTimeExtensions DateTime StartOfDay/EndOfDay/StartOfWeek/StartOfMonth/StartOfQuarter/StartOfYear(及对应 End)、GetAge、AddBusinessDays、ToUnixTimestamp/FromUnixTimestamp、IsWeekend/IsWeekday、GetDaysBetween/GetBusinessDaysBetween、ParseDate/TryParseDate/Format、ConvertTimeZone/ConvertToUtc/ConvertFromUtc
CollectionExtensions IEnumerable<T> / IList<T> IsNullOrEmpty/HasValue/EmptyIfNull、FirstOrDefaultSafe/LastOrDefaultSafe、AsReadOnly/ToHashSet、ForEach/ForEachAsync/ForEachParallelAsync、CountSafe、ToDelimitedString、Batch、DistinctBy、ElementAtOrDefaultSafe

3. 数据传输对象 (Models) — 命名空间 Healnet.Common.Models

类 说明
BaseDto / BaseDto<TKey> DTO 基类:Id
AuditableDto / AuditableDto<TKey> 可审计 DTO:CreatedAt/CreatedBy/UpdatedAt/UpdatedBy
PaginationDto 分页参数:Page/PageSize/SortBy/SortDirection + GetSkipCount()/NeedSorting()/IsAscending()

⚠️ ApiResponse / PagedResult / Result 不存在于 Common(它们在 Healnet.Core.Responses)。

4. 文件存储 (FileStorage) — 命名空间 Healnet.Common.FileStorage

类型 说明
IFileService 文件服务抽象(上传/下载/删除/生成访问 URL/GeneratePresignedUrl(3.1.0 新增,OSS 直连下载预签名 URL))
FileServiceBase (abstract) 基类,持有 FileStorageOptions _options;3.1.0 起新增 GeneratePresignedUrl 抽象方法
LocalFileService 本地文件系统实现;GeneratePresignedUrl 显式抛 NotSupportedException 兜底
OssFileService (abstract) 对象存储基类(具体实现由宿主/Infrastructure 提供,如 AliyunOssFileService)
FileStorageOptions StorageType(默认 "Oss")、LocalStoragePath、BaseUrl、MaxFileSize(50MB)、AllowedExtensions、OssEndpoint/OssAccessKeyId/OssAccessKeySecret/OssBucketName
FileUploadResult / FileInfoDto 结果 DTO
Excel 子命名空间 IExcelService + ExcelService(ClosedXML)
Pdf 子命名空间 IPdfService + PdfService(QuestPDF)

5. 其他模块

模块 命名空间 说明
映射扩展 Healnet.Common.Mapping MapsterExtensions(AddMapster/AddMapsterWithProfiles/MapTo/MapToList)、MappingProfile(abstract)、TypeAdapterSetter
验证扩展 Healnet.Common.Validation FluentValidationExtensions(AddFluentValidation/AddValidator<TValidator,TEntity>)、IValidationService/ValidationService、ValidationResultDto/ValidationErrorDto、扩展 AbstractValidator<T>(RuleForEmail/Phone/Url/Password/ChineseName/IdCard)
业务枚举 Healnet.Common.Enums ServiceStatus、LogLevel、CacheType、DatabaseType、MessageQueueType、ApiResponseCode、Gender、AuditAction、DataStatus
应用常量 Healnet.Common.Constants AppConstants(含嵌套 CacheKeys/HttpHeaders/ClaimTypes/DateTimeFormats/ErrorMessages)
集成事件 Healnet.Common.Events IntegrationEvent(抽象基类:EventId/EventName/Timestamp/CorrelationId/SourceService/Version)

依赖关系

graph LR
    A[Healnet.Common] --> B[FluentValidation]
    A --> C[Mapster]
    A --> D[ClosedXML]
    A --> E[QuestPDF]
    A --> F[Microsoft.AspNetCore.Http.Abstractions]

使用指南

1. 加密与哈希

using Healnet.Common.Helpers;

// 密码哈希(自动随机盐值,无需手动传盐)
var hashed = CryptoHelper.HashPassword("myPassword");
var isValid = CryptoHelper.VerifyPassword("myPassword", hashed);

// 安全 Token(密码学安全随机)
var token = CryptoHelper.GenerateRandomString(32);

// AES 加解密(密钥须由调用方显式传入,用 GenerateRandomString 生成并妥善保存)
string key = CryptoHelper.GenerateRandomString(32);
string encrypted = CryptoHelper.AesEncrypt("Hello", key);
var (ok, decrypted) = CryptoHelper.AesDecrypt(encrypted, key);   // (bool Ok, string? Result)

// RSA 非对称加解密
var (pub, pri) = CryptoHelper.GenerateRsaKeyPair();
string rsaCipher = CryptoHelper.RsaEncrypt("Hello", pub);
string rsaPlain = CryptoHelper.RsaDecrypt(rsaCipher, pri);

⚠️ 历史提示:CryptoHelper.GenerateAesKey() 不存在——密钥请用 GenerateRandomString(32) 生成。 另有底层 AESCrypto.AESEncrypt/AESDecrypt(string, string)(Key 会被截断/补齐至 32 字符;解密失败返回 (false, null) 不抛异常)。

2. JSON 序列化

using Healnet.Common.Helpers;

var obj = new { Name = "Healnet", Version = "4.0.9" };
string json = JsonHelper.Serialize(obj);                       // camelCase、紧凑、null 字段不输出
var result = JsonHelper.Deserialize<MyModel>(json);            // 大小写不敏感
string pretty = JsonHelper.SerializeIndented(obj);             // 缩进格式
string formatted = JsonHelper.Format(json);                    // 美化已有 JSON
string minified = JsonHelper.Minify(pretty);                   // 压缩
string merged = JsonHelper.Merge("{\"a\":1}", "{\"a\":2,\"b\":3}"); // 后者覆盖前者 → {"a":2,"b":3}
bool valid = JsonHelper.IsValid(json);
int version = JsonHelper.GetProperty<int>(json, "version");    // 取字段值(强类型)
var clone = JsonHelper.Clone(obj);                             // JSON 深拷贝
byte[] bytes = JsonHelper.SerializeToBytes(obj);               // UTF-8 字节

⚠️ 非 ASCII 默认转义:Serialize 输出 "张三" 为 "\u5F20\u4E09"(合法 JSON,反序列化自动还原, 但日志肉眼可读性差)。需要原文输出时传入自定义 options:

var options = new JsonSerializerOptions(JsonHelper.DefaultOptionsShape())
{
    Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};

3. 雪花 ID 生成

using Healnet.Common.Helpers;

// 默认实例
long id = IdGeneratorFactory.NewId();

// 自定义实例(数据中心 + 工作区)
var gen = IdGeneratorFactory.Create(workerId: 1, datacenterId: 1);
long customId = gen.NextId();
long[] batch = gen.NextIds(100);

// 解析 ID
long worker = gen.GetWorkerId(id);
long seq = gen.GetSequence(id);

🔴 已知缺陷(2026-11-02 单测发现,修复前请勿用 GetTimestamp): SnowflakeOptions.StartTimestamp 默认取 .NET Ticks 纪元(公元 1 年起算),而时间戳区实际仅 36 位 (dc 5 + worker 10 + seq 12 = 27 位位移,与注释宣称的 41 位不符),36 位毫秒 ≈ 2.18 年—— 自 2026-03-08 起生成的雪花 ID 已溢出为负数(唯一性暂未破坏;GetTimestamp 解析出错误年份)。 修复需调整纪元与位分配(破坏性变更),修复后此警告将移除。单元测试见 tests/Healnet.Tests。

4. 扩展方法

using Healnet.Common.Extensions;

// 字符串
string name = "  Hello World  ";
bool isEmpty = name.IsNullOrWhiteSpace();
string base64 = name.ToBase64();
string masked = "13800138000".MaskPhone();           // "138****8000"
bool isEmail = "test@example.com".IsEmail();
string slug = "Hello World".ToSlug();                // "hello-world"

// 日期
DateTime now = DateTime.Now;
bool isWeekend = now.IsWeekend();
int days = now.GetDaysBetween(new DateTime(2026, 1, 1));
var ts = now.ToUnixTimestamp();

// 集合
var list = new List<int> { 1, 2, 3, 4, 5 };
var paged = list.Batch(2);                            // 分批
var safe = list.EmptyIfNull();

5. DTO 基类

using Healnet.Common.Models;

public class UserDto : AuditableDto
{
    public string Name { get; set; } = string.Empty;
    public string Email { get; set; } = string.Empty;
}

public class QueryParams : PaginationDto
{
    public string? Keyword { get; set; }
}

6. 文件 / Excel / Pdf

using Healnet.Common.FileStorage;
using Healnet.Common.FileStorage.Excel;

// Excel 导出/导入
var data = new List<UserDto> { /* ... */ };
await excelService.ExportAndSaveAsync(data, "users.xlsx");
var imported = await excelService.ImportFromSavedFileAsync<UserDto>("users.xlsx");

7. 依赖注入注册(分模块,无聚合入口)

// 各模块独立注册,Common 不提供 AddCommonServices 聚合方法
builder.Services.AddMapster();
builder.Services.AddFluentValidation();
builder.Services.AddFileService(opt => { /* FileStorageOptions */ });
builder.Services.AddExcelService();
builder.Services.AddPdfService();

NuGet 包信息

属性 值
PackageId Healnet.Common
当前版本 4.0.9
目标框架 net10.0
主要依赖 FluentValidation [11.0.0,12.0.0)、Mapster [7.4.0,8.0.0)、ClosedXML [0.102.0,0.103.0)、QuestPDF [2024.3.0,2025.0.0)、Microsoft.AspNetCore.Http.Abstractions [2.2.0,3.0.0)
仓库 内部仓库

版本历史

以下变更说明整理自 Healnet.Common.csproj 的 PackageReleaseNotes,具体日期以各发布记录为准(本文不杜撰日期)。

版本 变更说明
v4.0.9 当前版本(自 4.0.0 后无公开 API 变更,仅随三库统一版本号推进)
v4.0.6 三库版本重新对齐至统一 4.0.6(本库自 4.0.0 后无代码变更,仅同步统一版本号,消除 4.0.0 分叉)
v4.0.0 随 Healnet 统一升版至 4.0.0(本库无代码变更,仅同步主版本号;破坏性变更来自 Core/Infrastructure)
v3.1.0 IFileService/FileServiceBase 新增 GeneratePresignedUrl(...) 预签名下载 URL(OSS 直连下载场景);LocalFileService 显式抛 NotSupportedException 兜底
v3.0.0 重大变更(破坏性):AESCrypto 移除硬编码密钥与无参重载 AESEncrypt(string)/AESDecrypt(string),密钥改由调用方显式传入;AESDecrypt 返回 (bool Ok, string? Result)(解密失败返回 (false, null),不再静默吞异常);GetSubString 跨平台编码 Encoding.Default→UTF8。升级须显式传密钥(且须与历史加密密钥一致,否则既有密文无法解密)
v2.0.7 三库版本统一 2.0.7(无代码变更)
v2.0.6 三库版本统一 2.0.6
v2.0.3 统一三库版本号;升级目标框架至 net10.0;更新所有依赖包至最新稳定版
v2.0.1 依赖包版本升级,修复若干已知问题
v2.0.0 重大版本更新,目标框架从 net8.0 升级至 net10.0,全面更新依赖包版本

许可证

MIT License

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 (2)

Showing the top 2 NuGet packages that depend on Healnet.Common:

Package Downloads
Healnet.Infrastructure

Healnet.Infrastructure 是 Healnet 框架的基础设施层类库,提供各种基础设施服务的封装和集成,包括 Consul 服务发现、Redis 缓存、RabbitMQ 消息队列、gRPC、Elasticsearch、Milvus 向量数据库、SQLSugar ORM、JWT 认证、YARP 反向代理、OpenTelemetry 可观测性、Serilog 日志框架、ClickHouse 列式数据库等。

Healnet.Core

Healnet.Core 是 Healnet 框架的核心业务层类库,提供领域层的基础接口和通用服务。包含仓储接口、工作单元、消息队列接口和统一异常处理。

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.0.10 74 11/3/2026
4.0.9 263 8/13/2026
4.0.8 141 8/13/2026
4.0.7 146 8/13/2026
4.0.6 130 8/10/2026
4.0.0 194 8/3/2026
3.1.0 144 7/24/2026
3.0.1 149 7/23/2026
3.0.0 136 7/16/2026
2.0.7 144 7/10/2026
2.0.5 149 7/8/2026
2.0.3 153 6/30/2026
2.0.1 155 6/30/2026
2.0.0 145 6/29/2026
1.7.3 147 6/29/2026
1.5.0 174 6/16/2026
1.4.0 144 6/15/2026
1.2.0 149 5/29/2026
1.1.1 146 5/25/2026
1.1.0 145 5/22/2026
Loading failed

v4.0.10: 代码审查缺陷批量修复(安全与正确性)。① 雪花ID生成器(P0):默认位宽改为 DatacenterIdBits=5 / WorkerIdBits=5(shift=22,时间戳恢复41位,可用至约2093年),修复旧布局(10位Worker)自 2024-01-01 纪元起 2026-03-06 已溢出产生负ID的缺陷;构造函数按位宽校验 WorkerId/DatacenterId 越界即抛 ArgumentOutOfRangeException;时间戳差值超出可用位宽时抛异常而非静默越过符号位;GetWorkerId 按位宽取掩码(原硬编码10位掩码);GetTimestamp 修复双重纪元偏移(_startTimestamp 为 .NET Ticks 毫秒刻度,原再叠加 Unix 纪元常量导致解析出 3995 年)并返回 UTC Kind;WaitNextMillis 加 Thread.Sleep(1) 防忙等;GetTimestamp 返回 UTC Kind;修正文档中错误的位布局说明与纪元示例。② IIdGenerator.NextId(workerId)/NextIds(count, workerId) 改为按 workerId 缓存复用生成器实例(原每次 new 独立实例,同毫秒调用返回重复ID)。③ LocalFileService 路径穿越修复:StartsWith 前缀比较改为 Path.GetRelativePath 校验(原可被 ../storage-evil 绕过);IFormFile 上传补 SanitizeFileName;UploadAsync 入口统一执行 MaxFileSize 与 AllowedExtensions 校验(原配置字段从未生效)。④ MappingProfile.CreateMap 改为在传入的 TypeAdapterConfig 上注册(原注册到临时实例后即丢弃,继承基类的 Profile 完全不生效)。⑤ JsonHelper 所有 JsonDocument 用 using 释放(修内存泄漏);RandomHelper 由"静态Random+锁"改 Random.Shared;PaginationDto 页码/页大小钳制最小1;GetBusinessDaysBetween 重写为按天枚举(原整除估算在跨周末区间返回负数/错误值);FromUnixTimestamp 改 .UtcDateTime(Kind=Utc);NetworkHelper.GetProcessIdByPort/GetPortsByProcessId 标记 Obsolete(实现不正确,返回值与目标端口/进程无关);AESCrypto 补 Aes/ICryptoTransform 的 using(IV与密钥派生逻辑一律未动,密文输出逐字节兼容);ExcelService 水印不再写入数据区单元格(原覆盖中间真实数据,仅保留页脚水印)并补空表 LastRowUsed/LastColumnUsed 空引用防护。已知限制:全部契约接口补 CancellationToken 归 5.0;AESCrypto 固定 IV 保留(兼容既有密文);CryptoHelper 吞异常返回空串语义不变;示例类保留。v4.0.0: 随 Healnet 统一升版至 4.0.0(本库无代码变更,仅同步主版本号;破坏性变更来自 Healnet.Core/Infrastructure)。v3.1.0: IFileService/FileServiceBase 新增 GeneratePresignedUrl(...) 预签名下载 URL(OSS 直连下载场景);LocalFileService 显式抛 NotSupportedException 兜底。v3.0.1: 随 Healnet 统一升版至 3.0.1(本库无代码变更,仅同步版本号)。v3.0.0: 重大变更(破坏性):AESCrypto 移除硬编码密钥与无参重载 AESEncrypt(string)/AESDecrypt(string),密钥改由调用方显式传入;AESDecrypt 返回 (bool Ok, string? Result)(解密失败返回 (false, null),不再静默吞异常);GetSubString 跨平台编码 Encoding.Default→UTF8。调用方升级须显式传密钥(且须与历史加密密钥一致,否则既有密文无法解密)。v2.0.7: 三库版本统一 2.0.7(无代码变更)。v2.0.6: 三库版本统一 2.0.6。v2.0.3: 统一三库版本号;升级目标框架至 net10.0;更新所有依赖包至最新稳定版。v2.0.1: 依赖包版本升级,修复若干已知问题。v2.0.0: 重大版本更新,目标框架从 net8.0 升级至 net10.0,全面更新依赖包版本。