2008-12-27 100 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级别的组件。

相关问题