Fast.IaaS
版本 3.5.28;目标 netstandard2.1。通用扩展与工具包,不依赖 Web 宿主或 Fast.Runtime,不需要 DI 注册。命名空间主要为 Fast.IaaS。
dotnet add package Fast.IaaS工具与扩展模块
| 公开类型 / 家族 | 合同与用途 |
|---|---|
DateTimeUtil、DateTimeExtension、TimeSpanExtension | 月首/月末、日期差、日期扩展与时长描述;不要混淆日期值与时区转换 |
MaskingUtil | NameMasking、NameKeepLastMasking、MobileMasking、IdCardMasking、EmailMasking、BankCardMasking、AddressMasking、CarNumberMasking、IpMasking;返回展示文本,不修改原始业务字段 |
VerificationUtil、ValidateExtension | 规则校验辅助,不是外部身份真实性验证 |
Base64Extension、StringEncodingExtension | Base64 与文本编码;Base64 方法默认随机前缀长度为 6,编码和解码须使用同一参数,不等同于标准无前缀 Base64 |
NumberUtil.IdToCodeByLong(long id, int maxLength = 12) | 数字标识编码;不应当作授权凭证 |
CoordinateUtil | IsInChina、WGS84ToGCJ02、GCJ02ToWGS84;经纬度参数顺序为 lat、lng |
FileUtil、GuidUtil、GlobalConstant | 文件、标识与公共常量;文件工具属于实际 I/O |
ObjectExtension、ConvertExtension、StringExtension、DecimalExtension | 对象/数值/文本转换;非法输入按具体方法异常合同处理,不承诺统一返回空值 |
IDictionaryExtension、DataTableExtension、GroupByExtension、LinqExpressionExtension | 集合、表格与表达式处理 |
AssemblyExtension、TypeExtension、MethodInfoExtension、FieldInfoExtension、EnumExtension、EnumItem<TProperty> | 反射和枚举辅助,包含类型与泛型约束 |
using Fast.IaaS;
string duration = TimeSpan.FromMinutes(1).ToDescription(); // 01分00秒
string displayPhone = MaskingUtil.MobileMasking("13800000000");RetryUtil
public static Task InvokeAsync(
Func<Task> action, int numRetries, int retryTimeout = 1000,
bool finalThrow = true, Type[] exceptionTypes = null,
Func<Exception, Task> fallbackPolicy = null,
Func<int, int, Task> retryAction = null,
CancellationToken cancellationToken = default);numRetries 是初次执行之外的最大重试次数,retryTimeout 单位毫秒;小于等于 0 的次数只直接执行一次,该分支不调用重试或降级回调,也不使用 finalThrow 屏蔽异常。action 为空抛 ArgumentNullException。异常类型列表非空时按可赋值关系过滤,失败耗尽或类型不匹配时调用 fallback;finalThrow = true 继续抛原异常,false 则结束。取消令牌在调用前、异常处理入口和重试等待期间检查;action 内部的取消需要自行传递。已检测到调用方取消时,不再调用 fallback,也不因 finalThrow = false 转为成功。
同步 Invoke 接收 Action 与同步回调,内部等待异步实现;异步调用链应使用 InvokeAsync。重试可能重复副作用,工具不提供幂等、事务或补偿。
树结构
TreeBuildUtil<TEntity, TProperty> 要求实体实现 ITreeNode<TProperty>,标识类型为满足比较、转换、格式化约束的值类型。SetRootParentId 默认为 default(TProperty);Build(List<TEntity>) 返回根节点列表,空输入返回空列表。父节点不在当前集合中的节点也被当作根,按 GetSort() 排序,并通过 SetChildren 修改节点的子集合。
输入应避免环和重复标识;当前递归实现不提供环检测,不应将任意外部图直接当作合法树。
CryptoUtil API 家族
| 入口 | 用途与参数边界 |
|---|---|
GenerateRandomBytes(int length)、FixedTimeEquals(byte[], byte[]) | 随机字节与固定时间比较 |
MD5Encrypt、SHA1Encrypt、SHA256Encrypt/SHA384Encrypt/SHA512Encrypt | 方法历史名称含 Encrypt,返回的是摘要,不是可解密密文;SHA256Bytes/SHA384Bytes/SHA512Bytes 返回字节 |
HMACSHA256Encrypt/HMACSHA384Encrypt/HMACSHA512Encrypt | 输入文本和密钥,返回消息认证摘要 |
PBKDF2SHA256、HashPasswordPBKDF2SHA256/VerifyPasswordPBKDF2SHA256 | 密钥派生及口令摘要验证;默认迭代次数 600000,摘要生成与验证须使用对应载荷格式 |
HKDFSHA256 | 输入密钥材料、可选 salt/info;默认 outputLength 为 32 字节 |
AESEncrypt/AESDecrypt | 显式 key、vector 及模式参数,默认 CipherMode.CBC |
AESEncryptAuthenticated/AESDecryptAuthenticated、AESEncryptWithPassword/AESDecryptWithPassword | 不同入口使用不同载荷格式;认证与口令方法分别成对使用,不与原始密钥接口混用 |
GenerateRSAKeyPair(int modulusLength = 2048) | 返回嵌套公开类型 CryptoUtil.PemKeyPair |
RSAEncryptOAEP/RSADecryptOAEP、RSASignPSS/RSAVerifyPSS | 分别为 RSA 加解密、签名验签;使用对应公钥/私钥参数 |
GenerateECDSAKeyPair、ECDSASign/ECDSAVerify | 默认曲线 P-256 |
GenerateECDHKeyPair、DeriveECDHSecret/DeriveECDHKeySHA256 | 密钥协商,默认曲线 P-256 |
算法实际可用性受目标运行时和系统加密提供器影响,netstandard2.1 编译合同不等于全部算法在所有系统可运行。详细载荷、异常和参数限制见各方法 XML 注释;不在文档中输出密钥或真实加密数据。
异步重试的消费端写法
以下类型可加入面向 .NET 8/9/10、引用本页版本 Fast.IaaS 的类库。由调用方传入可取消的读取操作;工具不把任意操作变成幂等操作。
using Fast.IaaS;
public sealed class RetryingReader
{
public async Task<string> ReadAsync(
Func<CancellationToken, Task<string>> read,
CancellationToken cancellationToken)
{
string result = "";
await RetryUtil.InvokeAsync(
async () => { result = await read(cancellationToken); },
numRetries: 2,
retryTimeout: 200,
finalThrow: true,
exceptionTypes: new[] { typeof(IOException) },
cancellationToken: cancellationToken);
return result;
}
}最多进行首次调用和两次重试;这里只重试 I/O 异常,最终失败继续抛出。取消必须同时传入实际 read 操作与重试器,才能覆盖读取及等待阶段。不要把扣款、发送通知或无幂等保证的写操作直接套用此示例。
来源与验证
依据 IaaS 源码、重试实现、树构造。本页覆盖模块及主要公开入口,不声称每个反射/加密重载已独立运行;本轮新增片段未编译。
