Fast.Runtime
版本 3.5.30;目标 net8.0、net9.0、net10.0。提供模块扫描、配置绑定、请求扩展、验证特性和共享运行上下文。其他 Web 模块通常传递引用此包;它不是应用启动器。
dotnet add package Fast.Runtime配置与 MVC 入口
命名空间为 Fast.Runtime。以下扩展返回原 IServiceCollection,用于继续注册。
| 公开入口 | 参数、返回与行为 |
|---|---|
AddConfigurableOptions<TOptions>(string path = null) | TOptions : class, new();未给 path 时由 MAppContext.GetOptionName<TOptions>() 推导;绑定配置、允许非公开属性绑定并启用 DataAnnotations 验证 |
IPostConfigure.PostConfigure() | 选项类型实现该接口后,绑定阶段追加后配置调用;默认值由各选项自己的实现提供 |
AddMvcFilter<TFilter>(Action<MvcOptions> configure = null) | TFilter : IFilterMetadata;将过滤器加入 MVC 选项,随后执行配置回调 |
AddMvcFilter(IFilterMetadata filter, Action<MvcOptions> configure = null) | 注册指定过滤器实例 |
以下为消费端 Program.cs,使用 Microsoft.NET.Sdk.Web,目标选择本页列出的 .NET 8、9 或 10,并安装上方指定包。app.Run() 表示正常宿主启动;本次文档维护不会执行它。
using Fast.Runtime;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Builder;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddConfigurableOptions<FeatureOptions>("Feature");
var app = builder.Build();
app.MapGet("/feature", (Microsoft.Extensions.Options.IOptions<FeatureOptions> options) => options.Value.BatchSize);
app.Run();
public sealed class FeatureOptions : IPostConfigure
{
public int? BatchSize { get; set; }
public void PostConfigure() => BatchSize ??= 50;
}配置节点由宿主的 appsettings.json、环境变量或其它配置提供器提供。选项验证异常与后配置异常不会被本扩展转为成功结果。
运行上下文与公开辅助类型
| API / 类型 | 使用边界 |
|---|---|
MAppContext.Assemblies、ProjectAssemblies、Types、EffectiveTypes、ProjectEffectiveTypes | 框架扫描集合;动态 API、约定式 DI 等按这些集合发现类型,并非扫描磁盘上任意程序集 |
SuppressSnifferAttribute | 标记不参与框架类型嗅探的类型 |
MAppContext.ConsoleWrite(Action<ConsoleWriter>) | 同步执行回调;串行保护控制台输出,在 finally 恢复进入时颜色;输出重定向时不写颜色控制 |
ConsoleWriter | ForegroundColor、BackgroundColor、Write、WriteLine、ResetColor();回调异常继续传播,不在回调中启动未等待任务 |
MAppContext.GetExecutionTime(Action) | 执行操作并取得耗时,不是取消或超时机制 |
GetServiceProvider、GetTraceId、GetCurrentStartupUri | 接收服务提供器、请求或服务器对象;后台作业不能假设 HTTP 请求存在 |
UserFriendlyException 及扩展 | 携带可由上层异常处理模块识别的业务异常信息;Runtime 自身不保证 HTTP 响应包装 |
ApiInfoAttribute、MapHubAttribute、FastEnumAttribute | API 描述、Hub 路由和枚举元信息 |
StringRequiredAttribute、数值/日期/枚举 Required 特性 | DataAnnotations 验证入口;不同类型分别验证,不等同于通用空值判断 |
LinqExpression、表达式与集合扩展 | 构建/组合表达式;能否被 ORM 翻译取决于实际查询提供器 |
请求扩展的 LocalIpv4/LocalIpv6 使用服务器连接端地址;RemoteIpv4/RemoteIpv6 使用 Connection.RemoteIpAddress。缺少请求上下文应按各方法空值合同处理,不把结果作为必有值。旧的 LanIpv4/LanIpv6 已不在当前 API 中。
来源与验证
依据源版本的 配置注册实现、MAppContext。本页为源码静态核对,新增片段本轮未编译、未运行;完整重载与 XML 参数合同以该版本源码为准。
后台作用域与防重放接口
没有 HTTP 请求时,框架不再创建隐藏 Scoped 作用域,也不会由无关请求结束时统一释放后台服务。后台任务应显式持有 CreateScope() / CreateAsyncScope(),在该任务结束时释放,并把作用域 provider 传给需要解析服务的调用。
根 provider 只用于已注册的 Singleton。作用域对象不能从 helper 中“借出”后失去所有者。显式登记的 UnmanagedObjects 属于应用生命周期,由宿主停止时清理,不是逐请求垃圾回收机制。
IRefreshTokenReplayStore.TryConsumeAsync(string key, DateTimeOffset expiresAt, long reuseLeewaySeconds, CancellationToken cancellationToken = default) 返回是否获得刷新令牌消费权。输入 key 是用途前缀加摘要,expiresAt 为绝对过期时间;不应输入明文令牌。MemoryRefreshTokenReplayStore 仅支持进程内缓存,不能替代共享存储的原子操作。
