基础设施(Aegis.Core.Infrastructure)
Aegis.Core.Infrastructure 是 Aegis 应用启动与基础设施装配的底座。它负责把 AegisApplication.Run(args)、Component.deps.json、组件注册、中间件串联、请求上下文初始化和控制器映射接起来。
组件概览
| 字段 | 说明 |
|---|---|
| 组件名称 | 基础设施 |
| 真实类库 | Aegis.Core.Infrastructure |
| 组件定位 | Aegis 应用启动入口、组件装配与基础请求管线 |
| 引入方式 | 安装 NuGet,并通过 AegisApplication.Run(args) 启动 |
| 组件声明 | 无独立组件名,本身是启动底座 |
| 关键文件 | Program.cs、Component.deps.json |
| 关键能力 | 加载组件配置、执行服务注册、执行中间件注册、初始化请求上下文、执行启动初始化器 |
它主要负责什么
这一个组件主要承担四类职责:
- 提供统一启动入口:
AegisApplication.Run(args) - 读取
Component.deps.json,按Services和Middlewares顺序装配组件 - 建立基础 Web API 管线,包括控制器映射和基础拦截器
- 提供
ICustomStartup、IInitializer这类应用启动扩展点
如果没有这一层,很多组件虽然安装了包,但不会自动进入应用启动流程。
最小可运行路径
第一步:使用统一启动入口
using Aegis.Core.Infrastructure;
AegisApplication.Run(args);
第二步:准备 Component.deps.json
AegisApplication 会在运行目录下读取 Component.deps.json。如果文件不存在,应用会直接启动失败。
{
"Components": {
"Services": [
"Logging",
"Swagger",
"BusinessServices",
"Authorization"
],
"Middlewares": [
"Swagger",
"Authorization"
]
}
}
第三步:按需补充项目级启动扩展
如果你的项目需要注册数据库、缓存、静态文件或启动后初始化逻辑,就实现 ICustomStartup。
using Aegis.Core.Infrastructure;
public sealed class Startup : ICustomStartup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
}
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
app.UseAuthorization();
}
public void ConfigureInitializer(IInitializerContext context)
{
context.AddInitializer<WarmupInitializer>();
}
}
启动时自动做了哪些事
默认启动流程里,基础设施会完成这些动作:
- 加载
Component.deps.json - 初始化配置能力
- 注册控制器与 JSON 序列化配置
- 加载
Aegis相关程序集 - 扫描并执行各组件的
Services注册 - 扫描并执行项目内的
ICustomStartup - 构建应用后执行中间件注册
- 启用基础拦截器并映射控制器
- 应用启动完成后执行
IInitializer
项目级扩展应该写在哪里
ICustomStartup
这是应用级扩展入口,适合放项目自己的服务注册、中间件补充和启动后初始化声明。
public interface ICustomStartup
{
void ConfigureServices(IServiceCollection services);
void Configure(IApplicationBuilder app);
void ConfigureInitializer(IInitializerContext context);
}
推荐分工:
ConfigureServices:注册数据库、缓存、第三方 SDK、业务依赖Configure:补充静态文件、授权等应用中间件ConfigureInitializer:声明应用启动完成后执行的初始化器
IInitializer
适合做“应用启动完成后立即执行一次”的事情,比如预热、连通性检查、启动提醒。
using Aegis.Core.Infrastructure;
public class WarmupInitializer : IInitializer
{
public void Initialize()
{
Console.WriteLine("Warmup completed.");
}
}
public void ConfigureInitializer(IInitializerContext context)
{
context.AddInitializer<WarmupInitializer>();
}
请求进入后它还做了什么
基础设施会默认启用 Aegis 的基础拦截链,其中最需要知道的是这两件事:
- 为请求准备
X-Request-Id - 初始化
ActionContext.Current
这意味着在控制器、服务、远程调用链路里,你都可以拿到当前请求的请求标识、请求头、客户端 IP 等信息。
var requestId = Aegis.Context.ActionContext.Current.RequestId;
var ipAddress = Aegis.Context.ActionContext.Current.IpAddress;
此外,基础设施还会全局注册 RequestLogFilter,默认日志级别为 Debug(等同于关闭)。详细配置参见 请求日志。
什么时候应该改 Component.deps.json
只要某个组件通过 Aegis 组件机制接入,你就应该先看它是不是需要写进 Component.deps.json。
可以按这个原则判断:
- 需要自动做服务注册的组件:看
Services - 需要自动进入请求管线的组件:看
Middlewares - 同时影响注册和请求管线的组件:两个列表都要配
Aegis.Core.Infrastructure 本身不需要把自己再写进 Component.deps.json,因为它就是读取和执行这份配置的底座。
按环境使用不同的 Component.deps.json
默认情况下,AegisApplication 会在运行目录下查找 Component.deps.json。如果你需要在开发、测试、生产等不同环境下加载不同的组件配置,可以在 appsettings.json 中配置 ComponentDeps 节点:
{
"ComponentDeps": "Component.deps.{Environment}.json"
}
{Environment} 会在运行时替换为当前环境名称(与 appsettings.{Environment}.json 的环境判断逻辑一致:依次读取 ASPNETCORE_ENVIRONMENT、DOTNET_ENVIRONMENT 环境变量,默认为 Production)。
例如 ASPNETCORE_ENVIRONMENT=Development 时,框架会加载 Component.deps.Development.json;ASPNETCORE_ENVIRONMENT=Production 时,加载 Component.deps.Production.json。
如果 ComponentDeps 指定的文件不存在,框架会回退使用默认的 Component.deps.json。如果没有配置 ComponentDeps 节点,行为与之前完全一致,直接读取运行目录下的 Component.deps.json。
接入完成后怎么确认成功
你至少应该确认这些点:
Program.cs使用的是AegisApplication.Run(args)- 应用目录下存在
Component.deps.json Services和Middlewares顺序符合组件依赖关系ICustomStartup能被自动发现并执行- 请求进入后能拿到
X-Request-Id和ActionContext.Current