当前位置 : 主页 > 网络编程 > ASP >

ASP.net:单例类,每个请求只实例化一次?

来源:互联网 收集:自由互联 发布时间:2021-06-24
我有一个名为UserContext的类,它跟踪我网站上给定用户的活动.它应该是一个单例类(每个用户只有一个实例).在 Windows窗体应用程序中,我可以写这样的东西: Class UserContext Public Shared Curre
我有一个名为UserContext的类,它跟踪我网站上给定用户的活动.它应该是一个单例类(每个用户只有一个实例).在 Windows窗体应用程序中,我可以写这样的东西:

Class UserContext

    Public Shared Current As New UserContext()

    Private Sub New(appName As String)

    [...]

End Class

但是在ASP.net应用程序上,这将在所有当前用户之间共享.

如果这个类只在一个Page实体中使用,我可以将UserContext实例存储在一个Page变量中 – 它不一定需要在回发中存活.但是其他实体(不了解Page)也调用UserContext,我希望它们都被赋予相同的实例.

我该怎么做才能确保每个http请求(或每个用户)只实例化一次类?我可以使用缓存吗?

Public Shared Function GetContext() As UserContext
    If HttpContext.Current.Cache("CurrentUserContext") Is Nothing Then HttpContext.Current.Cache("CurrentUserContext") = New UserContext()
    Return HttpContext.Current.Cache("CurrentUserContext")
End Function

可能会议状态是更好的选择吗?

缓存和会话状态都存在回发 – 是否有另一个选项随每个新请求重置?

谢谢你的帮助!

HttpContext.Current.Cache将在所有用户之间共享. HttpContext.Current.Session是每个用户,但后续请求仍然存在.

你需要HttpContext.Current.Items:

Public Shared Function GetContext() As UserContext
    If HttpContext.Current.Items("CurrentUserContext") Is Nothing Then HttpContext.Current.Items("CurrentUserContext") = New UserContext()
    Return HttpContext.Current.Items("CurrentUserContext")
End Function

这将确保每个请求和每个用户缓存存储的安全性.

网友评论