Проблема при получении нескольких экземпляров одной и той же переменной сеанса asp.net - PullRequest
1 голос
/ 16 марта 2010

У меня проблемы с получением нескольких экземпляров переменной сеанса из состояния сеанса InProc.

В следующем коде я сохраняю простой BusinessObject в переменной сеанса в событии Page_Load. Одним нажатием кнопки я пытаюсь извлечь объект обратно в 2 новых объявленных экземпляра того же BusinessObject.

Все прекрасно работает, пока я не изменю одно из свойств в первом экземпляре, он также изменит второй экземпляр.

Это нормальное поведение? Я бы подумал, так как это новые экземпляры, которые не будут демонстрировать статичное поведение?

Есть идеи, где я иду не так?

    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

Ответы [ 2 ]

0 голосов
/ 16 марта 2010

ваши BO1 и BO2 - это один и тот же объект BO1 - это имя, которое ссылается на некоторую область в памяти; BO2 - другое имя, которое ссылается на ту же область памяти; Сеанс («BO») ссылается на ту же область памяти.

Чтобы по-настоящему создать разные объекты BO1 и BO2, необходимо создать копию объекта - например, реализовать метод Clone () в классе вашего бизнес-объекта.

0 голосов
/ 16 марта 2010

Вы создаете экземпляры двух новых объектов, а затем устанавливаете каждый из них как один и тот же объект (т. Е. Объект из сеанса), так что ваше поведение соответствует ожиданиям.

Кстати, вы можете подумать о том, как будет работать ваша страница, если пользователь откроет две из этих страниц на вкладке - не вызовет ли ваш бизнес-объект в сеансе проблемы?

...