agilelabs-fx-docs main topics/hosting.md

宿主与启动

本页是 AgileLabs Framework 宿主层的规范主入口,聚合程序入口、宿主配置、Json、AutoMapper、服务注册和 Autofac 约定。

适用场景

  • 新建 MVC、WebAPI、JobHost。
  • 统一宿主入口、服务注册和全局 Json。
  • 需要在项目层再包一层标准宿主。

必须遵守

  • 统一通过 AgileLabApplication.StartApplicationAsync(...) 或项目标准宿主包装启动。
  • 宿主配置集中在 AppBuildOptions 及其派生类,不把关键配置散落在多个入口文件。
  • 容器默认使用 Autofac;参与自动构造的类型只保留一个 public 构造函数。
  • 服务注册优先使用 IServiceRegister / IAdvancedServiceRegister,应用级覆盖再使用 ConfigureServices
  • Json 全局配置集中在一个入口完成,确保 JsonNetSerializerSettings.Instance 与实际 MVC 配置一致。
  • AutoMapper 通过 Profile 扫描注册,不在业务层手动创建独立 MapperConfiguration

推荐做法

  • Program.cs 保持最薄,只保留启动。
  • ConfigureWebApplicationBuilderConfigureHostBuilderConfigureServicesConfigureMvcBuilderConfigureMvcOptions 按职责分层。
  • IServiceRegister 承担模块注册;需要高级容器特性时再用 IAdvancedServiceRegister
  • ConfigureMvcBuilder 统一挂 Json、过滤器、应用部件,避免多处序列化配置分叉。
  • 复杂业务可在框架启动外再封一层项目标准宿主,统一公共中间件与配置。

启动入口与请求管道的关系

宿主页关注的是“职责应该放在哪一层”,而请求管道页关注的是“这些职责最终按什么顺序进 ASP.NET Core”。两者需要连起来理解:

  • Program.cs 只负责启动,不负责堆业务中间件。
  • AppBuildOptions 负责宿主配置和功能开关。
  • IServiceRegister / IAdvancedServiceRegister 负责服务装配。
  • IRequestPiplineRegisterIEndpointConfig 负责把运行期中间件和终结点按阶段拼装进管道。

如果一个项目在宿主层定义了认证、Swagger、静态资源或诊断页,就应该继续向下追到 请求管道与 Endpoint 注册,确认它们实际落在 UseRouting() 之前还是之后。

常见坑

  • Program.csAppBuildOptions 里重复配置 MVC。
  • 在多个地方分别调用 AddNewtonsoftJson
  • 同一个类保留多个 public 构造函数,导致 Autofac/未注册对象解析行为不稳定。
  • DbContext、Repository、请求上下文注册成 Singleton

真实用例

  • niusys-webapiProgram.cs + AppConfigure + ServiceRegister
  • gmandarin-backend:多宿主统一走 AgileLabApplication
  • woscm:在框架入口外再包一层 WoScmApp.StartAppAsync<AppHostConfig>()

相关页面