减少web应用程序中的全局状态
本文关键字:全局 状态 web 应用程序 减少 | 更新日期: 2023-09-27 17:58:05
关于全局状态的替代方案有很多文章,但我对在web环境中的实现仍有疑问。
在ASP.NET中,存储在会话中的值实际上是全局变量,但如果不使用Session[]
集合,您似乎无法在页面和事件之间合理地存储(例如,经过身份验证的用户名、权限等)。(我通常会使用依赖项注入,但您不想将viewstate/url中的这些值传递给客户端。)
因此,我认为全球状态在网络开发中是一种必要的邪恶(由于HTTP的无状态性质),答案是负责任地使用它。什么是实现的好门面模式?像下面这样的静态类,在会话中只有get
s和set
s的值,并不能掩盖全局状态。
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; }
}
}
全局变量有问题,但全局值可以。因此,如果您想减轻全局状态的"问题",只需使这些对象不可变即可(我看不出DI是如何相关的)。
HttpContext
对象的User
属性对于存储这样的状态非常有用,因为它需要对应用程序的每个部分都可用,但只能在管道的早期分配。
因此,只需提出您自己的System.Security.Principal.IPrincipal
实现,它具有您想要的额外属性,并在AuthenticateRequest
事件期间将其分配给HttpContext.Current.User
。
我喜欢它的地方在于它定义了一组全局共享的固定状态变量。随着Session
的不受控制的使用,会有各种各样的垃圾,它们以不同的名称出现在同一个实体上,或者不使用。
当然,您仍然需要以某种方式确保不直接使用Session
。
当您使用它们时,这里不是全局变量,而是一个访问会话变量的好"接口"。
如果会话是在没有任何锁定机制的情况下处理的,他们可能会有问题,但asp.net会话正在锁定所有页面上对会话的完全访问,所以现在确实有任何问题。