跳到主要内容
版本:3.0.0

基础设施(Aegis.Core.Infrastructure)

Aegis.Core.Infrastructure 是 Aegis 应用启动与基础设施装配的底座。它负责把 AegisApplication.Run(args)Component.deps.json、组件注册、中间件串联、请求上下文初始化和控制器映射接起来。

组件概览

字段说明
组件名称基础设施
真实类库Aegis.Core.Infrastructure
组件定位Aegis 应用启动入口、组件装配与基础请求管线
引入方式安装 NuGet,并通过 AegisApplication.Run(args) 启动
组件声明无独立组件名,本身是启动底座
关键文件Program.csComponent.deps.json
关键能力加载组件配置、执行服务注册、执行中间件注册、初始化请求上下文、执行启动初始化器

它主要负责什么

这一个组件主要承担四类职责:

  • 提供统一启动入口:AegisApplication.Run(args)
  • 读取 Component.deps.json,按 ServicesMiddlewares 顺序装配组件
  • 建立基础 Web API 管线,包括控制器映射和基础拦截器
  • 提供 ICustomStartupIInitializer 这类应用启动扩展点

如果没有这一层,很多组件虽然安装了包,但不会自动进入应用启动流程。

最小可运行路径

第一步:使用统一启动入口

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_ENVIRONMENTDOTNET_ENVIRONMENT 环境变量,默认为 Production)。

例如 ASPNETCORE_ENVIRONMENT=Development 时,框架会加载 Component.deps.Development.jsonASPNETCORE_ENVIRONMENT=Production 时,加载 Component.deps.Production.json

如果 ComponentDeps 指定的文件不存在,框架会回退使用默认的 Component.deps.json。如果没有配置 ComponentDeps 节点,行为与之前完全一致,直接读取运行目录下的 Component.deps.json

接入完成后怎么确认成功

你至少应该确认这些点:

  • Program.cs 使用的是 AegisApplication.Run(args)
  • 应用目录下存在 Component.deps.json
  • ServicesMiddlewares 顺序符合组件依赖关系
  • ICustomStartup 能被自动发现并执行
  • 请求进入后能拿到 X-Request-IdActionContext.Current

相关主题页与配套组件