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

J.S*_*eve 3 asp.net session singleton instantiation httpwebrequest

我有一个叫做UserContext跟踪我网站上给定用户活动的课程.它应该是一个单例类(每个用户只有一个实例).在Windows窗体应用程序中,我可以写这样的东西:

Class UserContext

    Public Shared Current As New UserContext()

    Private Sub New(appName As String)

    [...]

End Class
Run Code Online (Sandbox Code Playgroud)

但是在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
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你的帮助!

Dar*_*rov 5

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
Run Code Online (Sandbox Code Playgroud)

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