agilelabs-fx-docs main topics/details/fundamentals/agilelabs-application/feature-switches.md

应用功能开关

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 SecurityServiceRegisterAgileLabContext.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.ItemsTempItems 或明确的 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 源码中是否有实际调用点。
  • 改动原因是否写入项目文档或升级说明。
  • 是否有启动日志、接口行为或容器解析行为可以验证。
  • 是否会改变框架默认生命周期、请求管道或服务注册链。
  • 是否属于迁移期兼容开关;如果是,应有收敛计划。

相关页面