开发者

Problem retrieving multiple instances of the same asp.net session variable

I'm having problems with retrieving multiple instances of a session variable from an InProc session state.

In the following code I persist a simple BusinessObject into a session variable on 开发者_StackOverflow中文版the Page_Load event. On the click of a button I try to retrieve the object back into 2 new declared instances of the same BusinessObject.

All works great until I change one of the properties in the first instance, it changes the second instance as well.

Is this normal behaviour? I would have thought as these were new instances they wouldn’t demonstrate static behaviour?

Any ideas where I'm going wrong?

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then
            ' create a new instance of a business object and set a containg variable
            Dim BO As New BusinessObject
            BO.SomeVariable = "test"
            ' persist to inproc session
            Session("BO") = BO
        End If

    End Sub

    Protected Sub btnRetrieveSessionVariable_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnRetrieveSessionVariable.Click

        ' retrieve the session variable to a new instance of BusinessObject
        Dim BO1 As New BusinessObject
        If Not Session("BO") Is Nothing Then BO1 = Session("BO")

        ' retrieve the session variable to a new instance of BusinessObject
        Dim BO2 As New BusinessObject
        If Not Session("BO") Is Nothing Then BO2 = Session("BO")

        ' change the property value on the first instance
        BO1.SomeVariable = "test2"

        ' why has this changed on both instances?
        Dim strBO1Property As String = BO1.SomeVariable
        Dim strBO2Property As String = BO2.SomeVariable

    End Sub

    ' simple BusinessObject class
    Public Class BusinessObject
        Private _SomeVariable As String

        Public Property SomeVariable() As String
            Get
                Return _SomeVariable
            End Get
            Set(ByVal value As String)
                _SomeVariable = value
            End Set
        End Property
    End Class


your BO1 and BO2 are the same object BO1 is a name that references some area in memory; BO2 is another name that references the SAME area of memory; Session("BO") references the SAME area of memory.

To truly create different objects BO1 and BO2, you should create a copy of the object - for example implement Clone() method in your business object class.


You're instantiating two new objects, and then setting each of them to be the same object (i.e. the one from session), so your behaviour is exactly as you would expect.

Incidentally, you may wish to consider how your page would perform if a user opens two of these pages in a tab - will your business object in the session then cause you some problems?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜