ObjectDataSource.ObjectDisposing Událost
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Nastane před objektem, který je identifikován vlastností TypeName je zahozen.
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
Event Type
Příklady
Tato část obsahuje dva příklady kódu. První příklad kódu ukazuje použití objektu ObjectDataSource s obchodním objektem a ovládacím GridView prvku k zobrazení informací. Druhý příklad kódu poskytuje obchodní objekt střední vrstvy, který se používá v prvním příkladu kódu.
Následující příklad kódu ukazuje použití ObjectDataSource ovládacího prvku s obchodním objektem a ovládacím GridView prvku k zobrazení informací. Můžete pracovat s obchodním objektem, který je velmi nákladný při vytváření (z hlediska času nebo prostředků) pro každou operaci dat, kterou webová stránka provádí. Jedním ze způsobů, jak pracovat s nákladným objektem, může být vytvoření instance jednoho objektu a jeho uložení do mezipaměti pro následné operace místo vytvoření a zničení pro každou operaci dat. Tento příklad ukazuje tento vzor. Událost můžete zpracovat ObjectCreating a nejprve zkontrolovat mezipaměť objektu a vytvořit pouze instanci, pokud ještě není uložena v mezipaměti. Potom zpracujte ObjectDisposing událost, aby se obchodní objekt ukládaly do mezipaměti pro budoucí použití, místo aby ji zničily. V tomto příkladu CancelEventArgs.Cancel kódu je vlastnost objektu ObjectDataSourceDisposingEventArgs nastavena tak, aby true směrovat ObjectDataSource na nevolat metodu Dispose objektu.
<%@ 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>
Následující příklad kódu poskytuje příklad střední vrstvy obchodní objekt, který používá předchozí příklad kódu. Příklad kódu se skládá ze základního obchodního objektu definovaného EmployeeLogic třídou, což je stavová třída, která zapouzdřuje obchodní logiku. V případě kompletního funkčního příkladu musíte tento kód zkompilovat jako knihovnu a použít tyto třídy ze stránky ASP.NET (.aspx souboru).
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
Následující příklad ukazuje, jak zpracovat ObjectDisposing událost při použití ObjectDataSource ovládacího prvku s LINQ to SQL třídy.
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;
}
Poznámky
Událost ObjectDisposing je vždy vyvolána před odstraněním instance obchodního objektu. Pokud obchodní objekt implementuje IDisposable rozhraní, Dispose metoda se volá po vyvolání této události.
ObjectDisposing Zpracovat událost volání jiných metod objektu, nastavit vlastnosti nebo provést vyčištění, které je specifické pro objekt před zničením objektu. Odkaz na objekt je přístupný vlastností ObjectInstance , která je vystavena objektem ObjectDataSourceEventArgs .
Při použití ObjectDataSource ovládacího prvku s LINQ to SQL třídy, musíte zrušit odstranění třídy kontextu dat v obslužné rutině ObjectDisposing události. Tento krok je nezbytný, protože LINQ to SQL podporuje odložené spuštění, zatímco ObjectDataSource ovládací prvek se pokusí likvidovat datový kontext po operaci Select.
Další informace o zpracování událostí naleznete v tématu Zpracování a vyvolávání událostí.