0

我正试图解决这个问题,但我就是做不到。

假设我有一个名为 custom 的类。我在其中有一个名为 User_ID 的变量,我用它来检索用户的会话(因此我不必一遍又一遍地调用会话变量)。像这样的东西:

Public Class custom

Public Shared User_ID as integer

Public Shared sub GatherUserID()

   User_ID = Session ("user_ID")

end sub

end class

是的,这是一个非常简单的例子,但它明白了我的意思。我在经典 ASP 中做过类似的事情(使用包含,而不是类),并且 User_ID 对当时访问相关页面的人来说是唯一的。

出于某种原因,这是我不明白的,当我在自定义类中使用 custom.User_ID 时,它是为所有人共享的。那是我不想要的。我想要的是能够使用这样的变量并保持用户特定。我看到了跨类共享变量的优势(例如数据库连接字符串),但我看不到如何在自定义类中设置自定义变量,我可以只为该用户使用而无需不断调用会话。

我看到我可以将它声明为属性而不是共享变量,但我真的不知道这到底是为了完成什么,而且似乎没有人有明确的解释。属性用户/会话是特定的吗?它会因此解决我的具体问题吗?这是我不明白的。

编辑:只是为了澄清一下,这个例子中的 user_ID 是我打算在创建页面期间被调用的几个地方使用的东西(例如主文件,页面本身,各种类。)因此创建的原因一个自定义变量。

谢谢。

4

2 回答 2

1

共享意味着它与应用程序域中的每个人共享。当您调用一个方法并设置一个共享变量时,使用该共享变量的所有内容都将返回相同的值。

您可以做的是包装您对 Session 对象的访问。使用模块或我的首选方法,使用扩展方法和我挂起会话的共享自定义类。这使我可以看到它来自 Session,但可以像 Session.vars.UserID 一样访问它,其中 UserID 是 vars 类的属性。

Module SessionExt

    Public Class SessionVars
        Private this as HttpSessionState
        Public New (ths as HttpSessionState)
            this = ths
        End New
        Public Property Example as Integer
            Get
               Static nm as String = MethodBase.GetCurrentMethod().Name.Substring(4)
               return CType(this(nm), Integer)
            End Get
            Set (value as Integer)
               Static nm as String = MethodBase.GetCurrentMethod().Name.Substring(4)
               this(nm) = value
            End Set
        End Property 
    End Class
    <Extension()>
    Public Function vars(ByVal this as HttpSessionState) as SessionVars
        return New SessionVars(this)
    End Function
End Module

就这样,你所有的会话变量都包含在一个漂亮的类中。添加新属性是简单的样板代码,您所要做的就是更改名称并设置类型。您可以将其重构为更好的名称,查看它的使用位置,使用它来包含更复杂的结构(数据表、其他类或结构等)。

注意:如果您使用的是 global.asax,那么当您的代码运行时,会话可能尚未建立,请注意您从那里调用的任何属性要么不使用会话状态,要么首先检查 null。

于 2012-10-16T23:13:29.487 回答
0
Public Class custom

Public User_ID as integer

Public sub GatherUserID()

   User_ID = Session ("user_ID")

end Sub

end Class

然后,对于每个启动会话的新用户:


Dim userSpecificCustom as New Custom()
userSpecificCustom.GatherUserID()

我是一个 C# 人,所以如果语法不是 100% 正确,请不要让我失望。

还建议将 User_ID 设为属性而不是公共字段。(参见例如http://www.vbdotnetheaven.com/uploadfile/manish1231/fields-and-properties-in-vb-net/http://blogs.msdn.com/b/vbteam/archive/2009/09 /04/properties-vs-fields-why-does-it-matter-jonathan-aneja.aspx )

于 2012-10-16T21:29:53.527 回答