2

有许多关于全局状态替代方案的帖子,但我对在 Web 环境中的实施仍有一些挥之不去的问题。

Session[]在 ASP.NET 中,存储在会话中的值实际上是全局变量,但如果不借助集合,您似乎无法跨页面和事件合理地存储例如经过身份验证的用户名、权限等。(我通常会使用依赖注入,但您不希望将 viewstate/url 中的这些值传递给客户端。)

因此,我认为全局状态是 Web 开发中必不可少的邪恶(由于 HTTP 的无状态特性),答案就是负责任地使用它。什么是好的外观模式实现?像下面这样的静态类,在会话中只有gets 和sets 值,并不能掩盖全局状态。

public class SessionWrapper
{
    public static string UserName
    {
        get { return Convert.ToString(Session["UserName"]); }
        set { Session["UserName"] = value; }
    }
    public static bool IsAuthenticated
    {
        get { return Convert.ToBoolean(Session["IsAuthenticated"]); }
        set { Session["IsAuthenticated"] = value; }
    }
}
4

3 回答 3

2

全局变量是有问题的,但全局很好。因此,如果您想减轻全局状态的“问题​​”,只需使这些对象不可变(我不明白 DI 是如何相关的)。

对象的User属性HttpContext对于存储此类状态很有用,因为它需要可用于应用程序的每个部分,但只能在管道的早期分配。

因此,只需提出您自己的实现,System.Security.Principal.IPrincipal它具有您想要的额外属性,并HttpContext.Current.User在事件期间将其分配给它AuthenticateRequest

于 2013-02-05T21:15:32.303 回答
0

我喜欢这个的是它定义了一组固定的全局共享的状态变量。随着不受控制的使用,Session各种各样的垃圾都会以不同的名称出现在同一个实体中,什么不是。

当然,您仍然需要以某种方式确保Session不直接使用它。

于 2013-02-05T21:02:57.867 回答
0

当你在这里使用它们时,它们不是全局变量——而是一个很好的“接口”来访问你的会话变量。

如果会话在没有任何锁定机制的情况下处理,他们可能会遇到问题,但是 asp.net 会话正在锁定对所有页面的会话的完全访问权限,所以你现在确实有任何问题。

于 2013-02-05T21:36:50.980 回答