Skip to content

Fast.Runtime

逐成员 API、参数与返回参考

版本 3.5.30;目标 net8.0net9.0net10.0。提供模块扫描、配置绑定、请求扩展、验证特性和共享运行上下文。其他 Web 模块通常传递引用此包;它不是应用启动器。

bash
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() 表示正常宿主启动;本次文档维护不会执行它。

csharp
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.AssembliesProjectAssembliesTypesEffectiveTypesProjectEffectiveTypes框架扫描集合;动态 API、约定式 DI 等按这些集合发现类型,并非扫描磁盘上任意程序集
SuppressSnifferAttribute标记不参与框架类型嗅探的类型
MAppContext.ConsoleWrite(Action<ConsoleWriter>)同步执行回调;串行保护控制台输出,在 finally 恢复进入时颜色;输出重定向时不写颜色控制
ConsoleWriterForegroundColorBackgroundColorWriteWriteLineResetColor();回调异常继续传播,不在回调中启动未等待任务
MAppContext.GetExecutionTime(Action)执行操作并取得耗时,不是取消或超时机制
GetServiceProviderGetTraceIdGetCurrentStartupUri接收服务提供器、请求或服务器对象;后台作业不能假设 HTTP 请求存在
UserFriendlyException 及扩展携带可由上层异常处理模块识别的业务异常信息;Runtime 自身不保证 HTTP 响应包装
ApiInfoAttributeMapHubAttributeFastEnumAttributeAPI 描述、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 仅支持进程内缓存,不能替代共享存储的原子操作。