首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

擺脫 HttpContext 依賴:提升 ASP.NET 可測試性與架構純淨度

     編輯:關於ASP.NET

HttpContext 的測試痛點

HttpContext 是「萬能神器」:Request、Response、Session、Cache、User、Application……集萬千寵愛於一身,導致:

  • 單元測試需構造龐大 Mock 對象,測試代碼膨脹
  • 關注點混雜:業務邏輯與 HTTP 協議細節耦合
  • 難以並行測試:靜態單例天然不支持併發隔離

抽象層演進:HttpContextBase

System.Web.Abstractions.dll 提供 HttpContextBase 抽象基類,ASP.NET MVC 全面依賴它而非具體實現。

MVP/MVC 中的正確姿勢

錯誤示範(Controller 直接依賴 HttpContext)

public ActionResult Delete(string userName) {
    this.MiddleTier.UserManager.Delete(userName);
    Uri urlReferrer = this.Request.UrlReferrer; // 直接用 Request
    return this.Redirect(urlReferrer.ToString());
}

正確示範(Model Binder 封裝協議轉換)

// 自定義 Model Binder
public class ReferrerModelBinder : IModelBinder {
    public object BindModel(ControllerContext ctx, ModelBindingContext bindingContext) {
        return ctx.HttpContext.Request.UrlReferrer?.ToString();
    }
}

// Controller 純粹處理業務
public ActionResult Delete(string userName, [ModelBinder(typeof(ReferrerModelBinder))] string returnUrl) {
    _userService.Delete(userName);
    return Redirect(returnUrl ?? "/");
}

核心原則:分離關注點

  1. View/Controller 只見 ViewModel/DTO,不見 HttpContext
  2. Model Binder / Filter / Middleware 負責 HTTP 語義到領域模型的轉換
  3. Service/Domain 層 零依賴 System.Web,純 .NET Standard 庫

這樣單元測試只需構造純對象圖,無需任何 Mock 框架即可驗證業務邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved