ObjectDataSource.ObjectDisposing Zdarzenie

Definicja

Występuje przed odrzuceniem obiektu, który jest identyfikowany przez TypeName właściwość.

C#
public event System.Web.UI.WebControls.ObjectDataSourceDisposingEventHandler ObjectDisposing;

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 .

ASP.NET (C#)
<%@ 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>

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).

C#
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;
    }
  }
}

W poniższym przykładzie pokazano, jak obsługiwać ObjectDisposing zdarzenie podczas używania ObjectDataSource kontrolki z klasą LINQ to SQL.

C#
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ń.

Dotyczy

Produkt Wersje
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1

Zobacz też