减少web应用程序中的全局状态

本文关键字:全局 状态 web 应用程序 减少 | 更新日期: 2023-09-27 17:58:05

关于全局状态的替代方案有很多文章,但我对在web环境中的实现仍有疑问。

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

因此,我认为全球状态在网络开发中是一种必要的邪恶(由于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; }
    }
}

减少web应用程序中的全局状态

全局变量有问题,但全局可以。因此,如果您想减轻全局状态的"问题",只需使这些对象不可变即可(我看不出DI是如何相关的)。

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

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

我喜欢它的地方在于它定义了一组全局共享的固定状态变量。随着Session的不受控制的使用,会有各种各样的垃圾,它们以不同的名称出现在同一个实体上,或者不使用。

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

当您使用它们时,这里不是全局变量,而是一个访问会话变量的好"接口"。

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