2

上有替代全局状态提供了许多职位,但我有一个关于在网络环境中实现挥之不去的问题。全球范围内减少状态

在ASP.NET中,存储在会话值实际上是全局变量,但似乎你不能合理地存储,例如,认证的用户名,权限等跨页和事件而不诉诸Session[]集合。 (我通常会使用依赖注入,但你不希望将这些值在视图状态/ URL中传递给客户端)。

所以我认为全球状态是Web开发中的一个必要的恶魔(由于无状态HTTP的性质),答案是只负责任地使用它。什么是实施的好门面模式?一个静态类,例如下面的静态类,会话中的get s和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; } 
    } 
} 
+0

我不知道我是否理解这个问题。你是否说你需要避免在服务器上存储状态(例如在数据库或内存缓存中)? –

+0

我不明白你的问题以太。 (请问你可以发一些关于全局状态的替代方法吗?) – Aristos

+0

不,我在问如何在大型Web应用程序中避免全局变量的所有典型缺陷,这些大型Web应用程序通常必须使用会话(例如,用于身份验证值,设置等)。参见[为什么是全球国家如此邪恶?(http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil) –

回答

2

全球变量有问题,但全球都很好。所以如果你想缓解全局状态的“问题​​”,那么简单地让这些对象不可变(我没有看到DI是如何相关的)。

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

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

+0

据我所知,DI *与绕过web应用程序中全局状态的问题无关,但它是我在(在线)看到的一般全局状态问题中最常见的解决方案,这就是为什么我提到过它。 –

+0

@JustinSatyr不用担心。当我说我没有看到DI是如何相关的时候,我真的是......可能有更多关于你知道我没有的问题。 –

0

我喜欢这个是什么,它定义了一个固定组全局共享状态变量。随着Session的不受控制的使用,有各种各样的垃圾到达那里与不同的名称为同一个实体,什么不是。

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

0

当你使用他们在这里不是全局变量 - 而是一个漂亮的“接口”来访问你的会话变量。

他们可能有问题,如果会话是与任何锁定机制处理,但asp.net会话锁定所有页的完全访问会话,所以你现在有任何问题。