2008-12-27 101 views
4

是否可行 - 最佳做法明智 - 使用第二層重定向用戶?三層Web應用程序

例如:

public static void ForceLogin() 
{ 
    HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieName]; 

    if (cookie != null) 
    { 
     if (Regex.IsMatch(cookie.Value, "^[0-9]+\\.[a-f0-9]+$")) 
     { 
      using (EibxDataContext db = new EibxDataContext()) 
      { 
       int count = db.Logins.Count(l => l.Password == cookie.Value); 

       if (count == 1) 
       { 
        return; 
       } 
      } 
     } 
    } 

    HttpContext.Current.Response.Redirect("~/Login.aspx"); 
} 

在最後一行,我用的是商業/業務邏輯層將用戶重定向到登錄頁面。

這應該在Presentation層完成嗎?

回答

8

絕對不是。業務邏輯層應該做出決定,UI層應該做重定向。業務層不應該知道關於HttpContext的任何內容,也不應該直接讀取cookie。將相關信息傳遞到業務層,以便業務層可以做出決定,並將決策傳遞給UI層,以便它可以處理由此產生的決策。

這是原因......如果從Web服務使用業務層,該怎麼辦?業務層如何在該實例中執行重定向?或者假設它與非Web客戶端一起使用?重定向在這方面沒有意義。如果你改變你的UI層,這不應該影響你的業務邏輯層,並且將重定向和cookie讀入混合到業務層中將會使用所提出的設計。

0

我想說你在業務邏輯中是正確的。表示層不應該對路由做出決定。

+1

也許不是「演示」,但重定向/路由仍然是一個「用戶界面」問題,不一定是您的服務代碼的工作。爲什麼要知道關於網絡服務器呢? – 2008-12-27 17:17:03

+0

同意馬克。不是downvoting(顯然OP喜歡這個答案),但我不想要除演示文稿處理重定向以外的任何層。這完全是UI的概念。讓業務層返回登錄失敗的結果,並讓UI找出要執行的操作。 – 2008-12-27 17:22:28

5

這取決於你如何定義圖層;例如,我的「業務邏輯」通常是與我試圖解決的問題相關的邏輯,並且對用戶界面一無所知。所以它不能進行重定向,因爲它無法訪問請求/響應。

就我個人而言,我會在UI層執行此操作;處理門禁管理員和託管人之間的原始交互是UI層爲Web應用程序工作的一部分。 IMO。例如,通過一個http模塊,它是(根據定義)一個UI級別的組件。

相關問題