ObjectDataSource.ObjectDisposing Zdarzenie
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Występuje przed odrzuceniem obiektu, który jest identyfikowany przez TypeName właściwość.
public:
event System::Web::UI::WebControls::ObjectDataSourceDisposingEventHandler ^ ObjectDisposing;
public event System.Web.UI.WebControls.ObjectDataSourceDisposingEventHandler ObjectDisposing;
member this.ObjectDisposing : System.Web.UI.WebControls.ObjectDataSourceDisposingEventHandler
Public Custom Event ObjectDisposing As ObjectDataSourceDisposingEventHandler
Typ zdarzenia
Przykłady
Ten rozdział zawiera dwa przykłady kodu. W pierwszym przykładzie kodu pokazano, jak używać ObjectDataSource obiektu z obiektem biznesowym i kontrolką do wyświetlania GridView informacji. Drugi przykład kodu zawiera obiekt biznesowy warstwy środkowej, który jest używany w pierwszym przykładzie kodu.
W poniższym przykładzie kodu pokazano, jak używać kontrolki ObjectDataSource z obiektem biznesowym i kontrolką do wyświetlania GridView informacji. Możesz pracować z obiektem biznesowym, który jest bardzo kosztowny do utworzenia (pod względem czasu lub zasobów) dla każdej operacji danych wykonywanej przez stronę sieci Web. Jednym ze sposobów pracy z kosztownym obiektem może być jednokrotne utworzenie wystąpienia, a następnie buforowanie go na potrzeby kolejnych operacji zamiast tworzenia i niszczenia go dla każdej operacji danych. W tym przykładzie pokazano ten wzorzec. Zdarzenie można obsługiwać ObjectCreating , aby najpierw sprawdzić pamięć podręczną dla obiektu i utworzyć tylko wystąpienie, jeśli jeszcze nie jest buforowane. Następnie obsłuż ObjectDisposing zdarzenie, aby buforować obiekt biznesowy do użytku w przyszłości, zamiast go niszczyć. W tym przykładzie kodu właściwość ObjectDataSourceDisposingEventArgs obiektu jest ustawiona tak, CancelEventArgs.Cancel aby true
polecenie ObjectDataSource nie wywoływać Dispose metody w obiekcie .
<%@ Import namespace="Samples.AspNet.CS" %>
<%@ Page language="c#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
// Instead of creating and destroying the business object each time, the
// business object is cached in the ASP.NET Cache.
private void GetEmployeeLogic(object sender, ObjectDataSourceEventArgs e)
{
// First check to see if an instance of this object already exists in the Cache.
EmployeeLogic cachedLogic;
cachedLogic = Cache["ExpensiveEmployeeLogicObject"] as EmployeeLogic;
if (null == cachedLogic) {
cachedLogic = new EmployeeLogic();
}
e.ObjectInstance = cachedLogic;
}
private void ReturnEmployeeLogic(object sender, ObjectDataSourceDisposingEventArgs e)
{
// Get the instance of the business object that the ObjectDataSource is working with.
EmployeeLogic cachedLogic = e.ObjectInstance as EmployeeLogic;
// Test to determine whether the object already exists in the cache.
EmployeeLogic temp = Cache["ExpensiveEmployeeLogicObject"] as EmployeeLogic;
if (null == temp) {
// If it does not yet exist in the Cache, add it.
Cache.Insert("ExpensiveEmployeeLogicObject", cachedLogic);
}
// Cancel the event, so that the object will
// not be Disposed if it implements IDisposable.
e.Cancel = true;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>ObjectDataSource - C# Example</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<asp:gridview
id="GridView1"
runat="server"
datasourceid="ObjectDataSource1">
</asp:gridview>
<asp:objectdatasource
id="ObjectDataSource1"
runat="server"
selectmethod="GetCreateTime"
typename="Samples.AspNet.CS.EmployeeLogic"
onobjectcreating="GetEmployeeLogic"
onobjectdisposing="ReturnEmployeeLogic" >
</asp:objectdatasource>
</form>
</body>
</html>
<%@ Import namespace="Samples.AspNet.VB" %>
<%@ Page language="vb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
' Instead of creating and destroying the business object each time, the
' business object is cached in the ASP.NET Cache.
Sub GetEmployeeLogic(sender As Object, e As ObjectDataSourceEventArgs)
' First check to see if an instance of this object already exists in the Cache.
Dim cachedLogic As EmployeeLogic
cachedLogic = CType( Cache("ExpensiveEmployeeLogicObject"), EmployeeLogic)
If (cachedLogic Is Nothing) Then
cachedLogic = New EmployeeLogic
End If
e.ObjectInstance = cachedLogic
End Sub ' GetEmployeeLogic
Sub ReturnEmployeeLogic(sender As Object, e As ObjectDataSourceDisposingEventArgs)
' Get the instance of the business object that the ObjectDataSource is working with.
Dim cachedLogic As EmployeeLogic
cachedLogic = CType( e.ObjectInstance, EmployeeLogic)
' Test to determine whether the object already exists in the cache.
Dim temp As EmployeeLogic
temp = CType( Cache("ExpensiveEmployeeLogicObject"), EmployeeLogic)
If (temp Is Nothing) Then
' If it does not yet exist in the Cache, add it.
Cache.Insert("ExpensiveEmployeeLogicObject", cachedLogic)
End If
' Cancel the event, so that the object will
' not be Disposed if it implements IDisposable.
e.Cancel = True
End Sub ' ReturnEmployeeLogic
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>ObjectDataSource - VB Example</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<asp:gridview
id="GridView1"
runat="server"
datasourceid="ObjectDataSource1">
</asp:gridview>
<asp:objectdatasource
id="ObjectDataSource1"
runat="server"
selectmethod="GetCreateTime"
typename="Samples.AspNet.VB.EmployeeLogic"
onobjectcreating="GetEmployeeLogic"
onobjectdisposing="ReturnEmployeeLogic" >
</asp:objectdatasource>
</form>
</body>
</html>
Poniższy przykład kodu zawiera przykładowy obiekt biznesowy warstwy środkowej używany przez poprzedni przykład kodu. Przykładowy kod składa się z podstawowego obiektu biznesowego zdefiniowanego EmployeeLogic
przez klasę, która jest klasą stanową, która hermetyzuje logikę biznesową. Aby uzyskać kompletny przykład roboczy, należy skompilować ten kod jako bibliotekę i użyć tych klas ze strony ASP.NET (.aspx pliku).
namespace Samples.AspNet.CS {
using System;
using System.Collections;
using System.Web.UI;
using System.Web.UI.WebControls;
//
// EmployeeLogic is a stateless business object that encapsulates
// the operations you can perform on a NorthwindEmployee object.
//
public class EmployeeLogic {
public EmployeeLogic () : this(DateTime.Now) {
}
public EmployeeLogic (DateTime creationTime) {
_creationTime = creationTime;
}
private DateTime _creationTime;
// Returns a collection of NorthwindEmployee objects.
public ICollection GetCreateTime () {
ArrayList al = new ArrayList();
// Returns creation time for this example.
al.Add("The business object that you are using was created at " + _creationTime);
return al;
}
}
}
Imports System.Collections
Imports System.Web.UI
Imports System.Web.UI.WebControls
Namespace Samples.AspNet.VB
Public Class EmployeeLogic
Public Sub New()
MyClass.New(DateTime.Now)
End Sub
Public Sub New(ByVal creationTime As DateTime)
_creationTime = creationTime
End Sub
Private _creationTime As DateTime
' Returns a collection of NorthwindEmployee objects.
Public Function GetCreateTime() As ICollection
Dim al As New ArrayList()
' Returns creation time for this example.
al.Add("The business object that you are using was created at " + _creationTime)
Return al
End Function 'GetCreateTime
End Class
End Namespace ' Samples.AspNet.VB
W poniższym przykładzie pokazano, jak obsługiwać ObjectDisposing zdarzenie podczas używania ObjectDataSource kontrolki z klasą LINQ to SQL.
Public Sub ExampleObjectDisposing(ByVal sender As Object, _
ByVal e As ObjectDataSourceDisposingEventArgs)
e.Cancel = True
End Sub
public void ExampleObjectDisposing(object sender,
ObjectDataSourceDisposingEventArgs e)
{
e.Cancel = true;
}
Uwagi
Zdarzenie ObjectDisposing jest zawsze wywoływane przed odrzuceniem wystąpienia obiektu biznesowego. Jeśli obiekt biznesowy implementuje IDisposable interfejs, metoda jest wywoływana Dispose po wywołaniu tego zdarzenia.
ObjectDisposing Obsłuż zdarzenie, aby wywołać inne metody obiektu, ustawić właściwości lub wykonać czyszczenie specyficzne dla obiektu przed zniszczeniem obiektu. Do odwołania do obiektu uzyskuje się dostęp za pomocą ObjectInstance właściwości, która jest uwidaczniona przez ObjectDataSourceEventArgs obiekt.
W przypadku używania ObjectDataSource kontrolki z klasą LINQ to SQL należy anulować usuwanie klasy kontekstu danych w procedurze obsługi dla ObjectDisposing zdarzenia. Ten krok jest niezbędny, ponieważ linQ to SQL obsługuje odroczone wykonywanie, podczas gdy kontrolka ObjectDataSource próbuje usunąć kontekst danych po operacji Select.
Aby uzyskać więcej informacji na temat obsługi zdarzeń, zobacz Obsługa i podnoszenie zdarzeń.