Pergunta

Estou tendo problemas em recuperar várias instâncias de uma variável de sessão de um estado de sessão inproc.

No código a seguir, persisto um objeto de negócios simples em uma variável de sessão no evento Page_load. Com o clique de um botão, tento recuperar o objeto de volta em duas novas instâncias declaradas do mesmo BusinessObject.

Tudo funciona muito bem até que eu mude uma das propriedades em primeira instância, também muda a segunda instância.

Isso é comportamento normal? Eu teria pensado, pois eram novos casos que eles não demonstrariam comportamento estático?

Alguma idéia de onde estou dando errado?

    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
Foi útil?

Solução

Seu BO1 e BO2 são o mesmo objeto BO1 é um nome que faz referência a alguma área na memória; O BO2 é outro nome que faz referência à mesma área de memória; Sessão ("BO") faz referência à mesma área de memória.

Para criar realmente objetos diferentes BO1 e BO2, você deve criar uma cópia do objeto - por exemplo, implementar o método clone () na sua classe de objeto de negócios.

Outras dicas

Você está instanciando dois novos objetos e, em seguida, definindo cada um deles como o mesmo objeto (ou seja, o da sessão), então seu comportamento é exatamente como você esperaria.

Aliás, você pode considerar como sua página executaria se um usuário abrir duas dessas páginas em uma guia - seu objeto de negócios na sessão fará alguns problemas?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top