详解 ASP.NET Core 运行时之模块化设计


ASP.NET Core 运行时,是指框架本身在运行时执行的部分,主要包括以下几个方面:HTTP 模块、中间件管道、路由匹配、请求处理、响应处理、视图引擎等。整体上可以分为以下几个模块:

1. 应用程序托管模块

应用程序托管模块是入口点,主要负责创建 Host、解析 ConfigureServices 和 Configure 方法,创建 Pipeline 等。Host 是应用程序的主机运行时环境,它提供了一些配置和管理应用程序的基础功能,例如配置文件的读取、依赖注入容器的初始化、中间件的注册和加载等。ConfigureServices 方法主要用于注册依赖注入服务;Configure 方法则用于配置中间件管道,在这里注册各种 Middleware 和 Endpoint。

2. HTTP 模块

HTTP 模块是 ASP.NET Core 的核心模块,它负责处理 HTTP 请求并生成 HTTP 响应。该模块由以下三个子模块组成:HttpContext、HttpRequest、HttpResponse。

  1. HttpContext:表示每个 HTTP 请求的上下文。其中包含了请求对象(HttpRequest)、响应对象(HttpResponse)、路由信息、HTTP 版本以及一些自定义数据等。
  2. HttpRequest:表示一个 HTTP 请求。其中包括了请求头、Cookie、查询字符串、Form 表单数据、请求正文等信息。
  3. HttpResponse:表示一个 HTTP 响应。其中包括了状态码、响应头、Cookie、响应正文等信息。

3. 中间件管道

中间件管道是 ASP.NET Core 处理请求的核心部分,它通过链式调用各种中间件来实现 HTTP 请求处理。每个 Middleware 可以选择把请求传递给下一个 Middleware 或者终止请求。中间件的注册和执行通过 IApplicationBuilder 接口进行控制。管道的执行流程是从第一个中间件开始执行,如果当前中间件没有终止请求,则使用 Next() 方法将请求传递给下一个中间件,直到所有的中间件都执行完毕并返回响应结果。

4. 路由模块

路由模块负责 URL 路由和 Endpoint 的匹配工作。在路由模块中,ASP.NET Core 提供了丰富的路由模板语法,用于构建 RESTful Web API 和 MVC 应用程序。路由模块通常涉及到以下几个类:Route、RouteTemplate、RouteData、RouteContext。

5. ActionInvoker 模块

ActionInvoker 模块是 MVC/Web API 中用于调用 Controller Action 方法的核心模块。该模块根据路由匹配的结果获取对应的 ActionDescriptor,然后通过反射调用 Controller 对应的 Action 方法,并自动将参数绑定到 Controller Action 方法中。

6. 视图引擎模块

视图引擎模块用于 MVC 中的视图渲染工作,它的主要职责是根据 Controller Action 指定的视图名称和模型数据,渲染出对应的 HTML 内容。视图引擎分为两种:Razor 视图引擎和自定义视图引擎。

在 ASP.NET Core 的源码设计中,框架采用了面向对象编程的思想,利用接口、抽象类等方式实现模块之间的松耦合关系,方便扩展和替换。设计中也使用了依赖注入、工厂等设计模式来进行对象管理和创建。总体上,ASP.NET Core 的源码设计非常精巧,充分体现了 .NET 生态系统的优秀品质。

以下是一个 ASP.NET Core 运行时的示例代码,以说明运行时如何工作:

using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;

namespace MyNamespace
{
    public class Startup
    {
        // Configure services for DI container
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }

        // Configure HTTP request pipeline
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
                endpoints.MapControllers();
            });
        }
    }
}

在上述示例中,Startup 类是应用程序托管模块。ConfigureServices 方法用于注册依赖注入服务,这里使用 AddControllers() 方法来添加 MVC 控制器。Configure 方法则负责配置中间件管道,首先判断当前是否在开发环境中,如果是,则调用 UseDeveloperExceptionPage() 中间件来为开发者提供异常信息的友好显示;接着使用 UseRouting() 方法启用 Routing,接下来使用 UseEndpoints() 方法来配置请求终结点,其中 MapGet() 方法配置了一个 GET 请求终结点“/”,返回“Hello World!”;MapControllers() 方法则将所有控制器动作方法映射到当前应用程序。

官方文档:https://learn.microsoft.com/en-us/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-7.0

举报
评论 0