宿主与启动
本页是 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保持最薄,只保留启动。ConfigureWebApplicationBuilder、ConfigureHostBuilder、ConfigureServices、ConfigureMvcBuilder、ConfigureMvcOptions按职责分层。IServiceRegister承担模块注册;需要高级容器特性时再用IAdvancedServiceRegister。ConfigureMvcBuilder统一挂 Json、过滤器、应用部件,避免多处序列化配置分叉。- 复杂业务可在框架启动外再封一层项目标准宿主,统一公共中间件与配置。
启动入口与请求管道的关系
宿主页关注的是“职责应该放在哪一层”,而请求管道页关注的是“这些职责最终按什么顺序进 ASP.NET Core”。两者需要连起来理解:
Program.cs只负责启动,不负责堆业务中间件。AppBuildOptions负责宿主配置和功能开关。IServiceRegister/IAdvancedServiceRegister负责服务装配。IRequestPiplineRegister和IEndpointConfig负责把运行期中间件和终结点按阶段拼装进管道。
如果一个项目在宿主层定义了认证、Swagger、静态资源或诊断页,就应该继续向下追到 请求管道与 Endpoint 注册,确认它们实际落在 UseRouting() 之前还是之后。
常见坑
- 在
Program.cs和AppBuildOptions里重复配置 MVC。 - 在多个地方分别调用
AddNewtonsoftJson。 - 同一个类保留多个
public构造函数,导致 Autofac/未注册对象解析行为不稳定。 - 把
DbContext、Repository、请求上下文注册成Singleton。
真实用例
- niusys-webapi:
Program.cs + AppConfigure + ServiceRegister。 - gmandarin-backend:多宿主统一走
AgileLabApplication。 - woscm:在框架入口外再包一层
WoScmApp.StartAppAsync<AppHostConfig>()。