Share via


ObjectDataSource.ObjectDisposing Kejadian

Definisi

Terjadi sebelum objek yang diidentifikasi oleh TypeName properti dibuang.

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 

Jenis Acara

Contoh

Bagian ini berisi dua contoh kode. Contoh kode pertama menunjukkan cara menggunakan ObjectDataSource objek dengan objek bisnis dan GridView kontrol untuk menampilkan informasi. Contoh kode kedua menyediakan objek bisnis tingkat menengah yang digunakan dalam contoh kode pertama.

Contoh kode berikut menunjukkan cara menggunakan ObjectDataSource kontrol dengan objek bisnis dan GridView kontrol untuk menampilkan informasi. Anda mungkin bekerja dengan objek bisnis yang sangat mahal untuk dibuat (dalam hal waktu atau sumber daya) untuk setiap operasi data yang dilakukan halaman Web Anda. Salah satu cara untuk bekerja dengan objek mahal mungkin adalah dengan membuat instansnya sekali, dan kemudian menyimpannya untuk operasi berikutnya alih-alih membuat dan menghancurkannya untuk setiap operasi data. Contoh ini menunjukkan pola ini. Anda dapat menangani ObjectCreating peristiwa untuk memeriksa cache untuk objek terlebih dahulu, dan hanya membuat instansnya, jika belum di-cache. Kemudian, tangani ObjectDisposing peristiwa untuk menyimpan objek bisnis untuk digunakan di masa mendatang, alih-alih menghancurkannya. Dalam contoh kode ini, CancelEventArgs.Cancel properti ObjectDataSourceDisposingEventArgs objek diatur ke true untuk mengarahkan ObjectDataSource agar tidak memanggil Dispose metode pada objek .

<%@ 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>

Contoh kode berikut menyediakan contoh objek bisnis tingkat menengah yang digunakan contoh kode sebelumnya. Contoh kode terdiri dari objek bisnis dasar, yang ditentukan oleh EmployeeLogic kelas , yang merupakan kelas stateful yang merangkum logika bisnis. Untuk contoh kerja lengkap, Anda harus mengkompilasi kode ini sebagai pustaka dan menggunakan kelas ini dari halaman ASP.NET (file .aspx).

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

Contoh berikut menunjukkan cara menangani ObjectDisposing peristiwa saat menggunakan ObjectDataSource kontrol dengan LINQ ke kelas 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;
}

Keterangan

Peristiwa ObjectDisposing selalu dinaikkan sebelum instans objek bisnis dibuang. Jika objek bisnis mengimplementasikan IDisposable antarmuka, Dispose metode dipanggil setelah peristiwa ini dinaikkan.

ObjectDisposing Tangani peristiwa untuk memanggil metode lain pada objek, mengatur properti, atau melakukan pembersihan yang khusus untuk objek sebelum objek dihancurkan. Referensi ke objek diakses oleh ObjectInstance properti , yang diekspos oleh ObjectDataSourceEventArgs objek .

Saat Anda menggunakan ObjectDataSource kontrol dengan kelas LINQ ke SQL, Anda harus membatalkan pembuangan kelas konteks data dalam handler untuk peristiwa tersebut ObjectDisposing . Langkah ini diperlukan karena LINQ ke SQL mendukung eksekusi yang ditangguhkan, sedangkan ObjectDataSource kontrol mencoba membuang konteks data setelah operasi Pilih.

Untuk informasi selengkapnya tentang cara menangani peristiwa, lihat Menangani dan Menaikkan Peristiwa.

Berlaku untuk

Lihat juga