天天看點

詳解 ASP.NET Core 運作時之子產品化設計

作者:小乖獸技術
詳解 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() 方法則将所有控制器動作方法映射到目前應用程式。

詳解 ASP.NET Core 運作時之子產品化設計

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