Frage

Ich habe Probleme mit mehreren Instanzen einer Session-Variablen von einer InProc Sitzungsstatus abgerufen werden.

Im folgenden Code bestehen ich ein einfaches Businessobject in eine Session-Variable auf dem Ereignis Page Load. Auf dem Klick auf eine Schaltfläche versuche ich das Objekt wieder in 2 neue erklärten Instanzen derselben Businessobject abgerufen werden.

Alle funktioniert gut, bis ich eine der Eigenschaften in der ersten Instanz ändern, es die zweite Instanz ändert sich auch.

Ist das ein normales Verhalten? Ich hätte gedacht, da diese neue Instanzen waren sie würden statische Verhalten nicht zeigen?

Irgendwelche Ideen, wo ich falsch gehe?

    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
War es hilfreich?

Lösung

Ihre BO1 und BO2 sind das gleiche Objekt BO1 ist ein Name, einigen Bereich, die Referenzen im Speicher; BO2 ist ein weiterer Name, der verweist auf dem gleichen Speicherbereich; Session ( "BO") verweist auf dem gleichen Speicherbereich.

So erstellen Sie wirklich verschiedene Objekte BO1 und BO2, können Sie eine Kopie des Objekts erstellen sollten -. Zum Beispiel implementieren Clone () -Methode in Ihrer Business-Objektklasse

Andere Tipps

Sie sind instanziieren zwei neue Objekte, und dann jeder von ihnen Einstellung das gleiche Objekt sein (das heißt, die ein von Sitzung), so dass Ihr Verhalten ist genau so, wie man erwarten würde.

Im übrigen kann man sich auch überlegen, wie Sie Ihre Seite durchführen würde, wenn ein Benutzer zwei dieser Seiten in einem Tab geöffnet wird - wird Ihr Business-Objekt in der Sitzung dann führen, dass Sie einige Probleme

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top