应用功能开关
AgileLabsApplicationFeatureSwitch 是 AgileLabs WebApp 宿主构建期的能力开关集合。它用于控制框架底层装配行为,例如认证授权管道、Autofac 解析方式和高级服务注册链,不是业务配置中心,也不适合承载项目自己的业务开关。
功能开关通常在 ConfigureHostBuilder 中设置:
await AgileLabApplication.StartApplicationAsync<DefaultMvcApplicationOptions>(options =>
{
options.ConfigureHostBuilder += (IHostBuilder hostBuilder, AppBuildContext context) =>
{
context.FeatureSwitch.IsIntegrateAspNetAuthentication = true;
};
});
开关清单
| 开关 | 默认值 | 当前源码触发点 | 推荐状态 | 主要风险 |
|---|---|---|---|---|
IsEnableAutoMapperLazyInit |
false |
当前 AgileLabs 源码仅保留定义;旧 Quantum 实现用于跳过启动期 AutoMapper 静态初始化 | 新项目保持默认 | 误以为会改变当前 DI 版 AutoMapper 注册行为 |
IsUseWorkContextCacheForPerRequestData |
false |
当前 AgileLabs 源码仅保留定义;旧 Quantum 口径与 PerRequestData/WorkContext.Items 兼容有关 |
新项目保持默认 | 把历史兼容开关当成新上下文缓存能力 |
IsEnableNotRegisteredTypeResolve |
false |
AppServcieProviderFactory.CreateBuilder 注册 Autofac AnyConcreteTypeNotAlreadyRegisteredSource |
仅迁移期临时开启 | 未注册类型被自动构造,掩盖 DI 注册缺失 |
IsEnableAdvancedServiceRegister |
true |
AppServcieProviderFactory.CreateBuilder 调用 AdvancedServiceRegister |
保持默认开启 | 关闭后 IAdvancedServiceRegister 链不执行 |
IsIntegrateAspNetAuthentication |
false |
SecurityServiceRegister 与 AgileLabContext.ConfigureRequestPipeline |
WebAPI 需要 [Authorize] 时开启 |
只开开关但未注册 authentication scheme |
IsEnableAutoMapperLazyInit
IsEnableAutoMapperLazyInit 的注释来自早期 AutoMapper 启动模型:开启后可以跳过启动阶段初始化,在第一次使用时再初始化,同时 AutoMapper.Mapper 静态实例会失效。
当前 AgileLabs WebApp 源码中,AutoMapper 主要通过 RegisterAutoMapperServices(buildContext) 注册到 DI,并扫描 Profile。这个开关在当前源码里只保留定义,没有直接触发现行 AutoMapper 注册流程。
使用建议:
- 新项目保持默认
false。 - 业务代码使用 DI 注入的
IMapper,不要依赖AutoMapper.Mapper静态实例。 - 如果从旧 Quantum 项目迁移,发现文档或代码提到该开关,应优先核对当前项目是否仍有静态 Mapper 依赖。
IsUseWorkContextCacheForPerRequestData
IsUseWorkContextCacheForPerRequestData 的历史口径是让 PerRequestData 使用基于 WorkContext.Items 的存储。当前 AgileLabs WebApp 源码中只保留开关定义,没有直接把 PerRequestData 切换到 WorkContext.Items 的调用点。
使用建议:
- 新项目保持默认
false。 - 请求级或业务执行单元级数据优先使用
IWorkContextCore.Items、TempItems或明确的 scoped 服务。 - 不要把它作为新项目的上下文缓存入口;需要缓存时,应明确缓存生命周期和释放边界。
IsEnableNotRegisteredTypeResolve
IsEnableNotRegisteredTypeResolve 开启后,框架会在 Autofac 中注册 AnyConcreteTypeNotAlreadyRegisteredSource,允许容器按需构造未注册的具体类型。它主要用于兼容遗留代码或迁移期项目。
开启时可配合 AppBuildOptions.UnregisteredTypeResolveNamespacePattern 限制命名空间范围,减少误解析:
await AgileLabApplication.StartApplicationAsync<DefaultMvcApplicationOptions>(options =>
{
options.UnregisteredTypeResolveNamespacePattern = "^MyProject\\.";
options.ConfigureHostBuilder += (IHostBuilder hostBuilder, AppBuildContext context) =>
{
context.FeatureSwitch.IsEnableNotRegisteredTypeResolve = true;
};
});
使用建议:
- 新项目不要默认开启。
- 迁移期可短期开启,并用命名空间正则限制范围。
- 最终应把依赖显式注册到 DI,而不是长期依赖未注册解析。
常见风险:
- 构造函数依赖缺失被延后到运行期暴露。
- 类型生命周期不清晰,绕过预期的 scoped/singleton 约束。
- AOP、拦截器或显式接口绑定可能没有按预期生效。
IsEnableAdvancedServiceRegister
IsEnableAdvancedServiceRegister 控制 IAdvancedServiceRegister 链是否执行,默认值为 true。框架在 Autofac 容器构建阶段调用 AgileLabContext.AdvancedServiceRegister(...),让高级注册器可以参与容器级装配。
使用建议:
- 默认保持开启。
- 只有在排查启动问题、裁剪宿主能力或做极小运行时场景时,才考虑临时关闭。
- 关闭前必须确认项目和引用组件没有依赖
IAdvancedServiceRegister完成关键服务注册。
关闭后的典型影响:
- 高级服务注册器不会执行。
- 依赖 Autofac 高级能力的模块可能缺少注册。
- 启动日志中不会出现对应高级注册链的配置记录。
IsIntegrateAspNetAuthentication
IsIntegrateAspNetAuthentication 控制 AgileLabs WebApp 是否集成 ASP.NET Core 认证授权管道。开启后,框架会:
- 在服务注册阶段调用
AddAuthorization()。 - 注册默认
IAuthorizationMiddlewareResultHandler。 - 在
UseRouting()之后、UseEndpoints()之前调用UseAuthentication()和UseAuthorization()。
它不负责具体认证方案。项目仍需自行注册 JWT Bearer、Cookie、Header handler 或其他 authentication scheme。
最小配置示例:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
// TokenValidationParameters 由项目配置
});
await AgileLabApplication.StartApplicationAsync<DefaultMvcApplicationOptions>(options =>
{
options.ConfigureHostBuilder += (IHostBuilder hostBuilder, AppBuildContext context) =>
{
context.FeatureSwitch.IsIntegrateAspNetAuthentication = true;
};
});
完整引入步骤见 接入 ASP.NET Core 认证授权。
引入检查
修改 FeatureSwitch 前后,至少确认这些点:
- 该开关在当前 AgileLabs 源码中是否有实际调用点。
- 改动原因是否写入项目文档或升级说明。
- 是否有启动日志、接口行为或容器解析行为可以验证。
- 是否会改变框架默认生命周期、请求管道或服务注册链。
- 是否属于迁移期兼容开关;如果是,应有收敛计划。