1

InProcセッション状態からセッション変数の複数のインスタンスを取得する際に問題が発生しました。

次のコードでは、単純なBusinessObjectをPage_Loadイベントのセッション変数に永続化します。ボタンをクリックすると、同じBusinessObjectの2つの新しく宣言されたインスタンスにオブジェクトを取得しようとします。

最初のインスタンスでプロパティの1つを変更するまで、すべてがうまく機能します。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
4

2 に答える 2

0

2つの新しいオブジェクトをインスタンス化し、それぞれを同じオブジェクト(つまり、セッションからのオブジェクト)に設定しているため、動作は期待どおりです。

ちなみに、ユーザーがこれらのページのうち2つをタブで開いた場合に、ページがどのように機能するかを検討することをお勧めします。セッション内のビジネスオブジェクトによって問題が発生しますか?

于 2010-03-16T12:42:27.773 に答える
0

BO1とBO2は同じオブジェクトです。BO1はメモリ内のある領域を参照する名前です。BO2は、同じメモリ領域を参照する別の名前です。Session( "BO")は、同じメモリ領域を参照します。

異なるオブジェクトBO1とBO2を実際に作成するには、オブジェクトのコピーを作成する必要があります。たとえば、ビジネスオブジェクトクラスにClone()メソッドを実装します。

于 2010-03-16T12:43:04.713 に答える