我在与从InProc会话状态检索会话变量的多个实例的问题。

在下面的代码我坚持一个简单BusinessObject的插入Page_Load事件会话变量。在一个按钮的点击我试着检索对象回到同一BusinessObject的2分新申报的情况。

,直到我改变在第一个实例的属性之一,它改变了第二个实例以及所有的巨大的。

这是正常的行为呢?我还以为这些是新的情况下,他们不会表现出静态?

任何想法,我要去哪里错了?

    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
有帮助吗?

解决方案

您BO1和BO2是相同的对象 BO1是引用在内存中一些区域的名称; BO2是引用的内存在同一地区的另一名;会话( “BO”)引用的存储器中的相同区域中。

要真正创建不同的对象BO1和BO2,你应该创建对象的副本 - 例如实现业务对象类的clone()方法

其他提示

您正在实例化两个新的对象,然后设置他们每个人是同一个对象(即从一个会话),所以你的行为是完全按照你期望的那样。

顺便说一句,您不妨考虑一下如何,如果用户打开两个选项卡这些网页的你的页面将执行 - 将业务对象的会话,然后您造成一定的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top