我遇到从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
答案 0 :(得分:0)
您正在实例化两个新对象,然后将每个对象设置为同一个对象(即会话中的对象),因此您的行为完全符合您的预期。
顺便提一下,如果用户在选项卡中打开其中两个页面,您可能希望考虑页面的执行情况 - 会话中的业务对象是否会导致问题?
答案 1 :(得分:0)
您的BO1和BO2是同一个对象 BO1是引用内存中某些区域的名称; BO2是引用SAME内存区域的另一个名称;会话(“BO”)引用内存的SAME区域。
要真正创建不同的对象BO1和BO2,您应该创建对象的副本 - 例如,在业务对象类中实现Clone()方法。