Fast.DynamicApplication
版本 3.5.35;目标 net8.0、net9.0、net10.0;依赖 Fast.Runtime 与 Fast.UnifyResult。将被发现的应用服务映射为 MVC API。
dotnet add package Fast.DynamicApplication注册和最小应用服务
公开入口为 AddDynamicApplication(this IServiceCollection services, string routePrefix = null),返回原服务集合。必须先调用 AddControllers() 或 AddControllersWithViews();缺少 ApplicationPartManager 时立即抛 InvalidOperationException。
以下为消费端 Program.cs,使用 Microsoft.NET.Sdk.Web,目标选择本页列出的 .NET 8、9 或 10,并安装上方指定包。app.Run() 表示正常宿主启动;本次文档维护不会执行它。
using Fast.DynamicApplication;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Builder;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddDynamicApplication("api");
var app = builder.Build();
app.MapControllers();
app.Run();
[Route("api/sample")]
public sealed class SampleService : IDynamicApplication
{
[HttpGet("message")]
public string Message() => "hello";
}宿主另行 MapControllers();本例显式固定 route,避免消费者依赖类名/方法名推导。动态发现取决于框架程序集扫描范围,不等于任意加载的 DLL 都暴露 API。
描述与路由合同
| 类型 / 成员 | 语义 |
|---|---|
IDynamicApplication | 动态 API 服务标记 |
DynamicApplicationContext.RoutePrefix | 注册时设置的全局前缀,公开读取、内部设置 |
ApiDescriptionSettingsAttribute() | 描述设置,Order 默认 0 |
ApiDescriptionSettingsAttribute(bool enabled) | 设置 IgnoreApi = !enabled,影响 API Explorer;不能作为授权控制 |
ApiDescriptionSettingsAttribute(params string[] groups) | 设置 Groups,并使用 ## 连接分组名 |
Name、Module、Version | 参与名称、模块、版本约定 |
Groups、Order、Description | 文档分组、顺序、描述;Description 支持 HTML,内容来源需要受控 |
现有显式 Route/HTTP 特性优先参与路由配置。没有显式绑定来源的基础类型参数会被设置为 FromQuery;复杂对象和特殊绑定参数分别处理,不应推断所有参数都进入路径。对外稳定接口建议显式表达 HTTP 方法与绑定来源。
边界
此模块处理 MVC 控制器发现,不替代认证、权限、业务事务或 OpenAPI 文件生成。返回非泛型 Task/ValueTask 与同步值均需由 MVC 管道处理,具体 JSON 协议由序列化及统一结果模块决定。注册顺序错误是明确异常,不需要通过复制 ApplicationPartManager 绕开。
