Partilhar via


ObjectDataSource.ObjectDisposing Evento

Definição

Ocorre antes que o objeto identificado pela propriedade TypeName seja descartado.

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 

Tipo de evento

Exemplos

Esta seção contém dois exemplos de código. O primeiro exemplo de código demonstra como usar um ObjectDataSource objeto com um objeto de negócios e um GridView controle para exibir informações. O segundo exemplo de código fornece o objeto de negócios de camada intermediária que é usado no primeiro exemplo de código.

O exemplo de código a seguir demonstra como usar um ObjectDataSource controle com um objeto de negócios e um GridView controle para exibir informações. Você pode trabalhar com um objeto de negócios que é muito caro para criar (em termos de tempo ou recursos) para cada operação de dados que sua página da Web executa. Uma maneira de trabalhar com um objeto caro pode ser criar uma instância dele uma vez e, em seguida, armazená-la em cache para operações subsequentes em vez de criá-lo e destruí-lo para cada operação de dados. Este exemplo demonstra esse padrão. Você pode manipular o ObjectCreating evento para verificar primeiro o cache de um objeto e criar apenas uma instância dele, se ainda não estiver armazenado em cache. Em seguida, manipule o ObjectDisposing evento para armazenar em cache o objeto de negócios para uso futuro, em vez de destruí-lo. Neste exemplo de código, a CancelEventArgs.Cancel propriedade do ObjectDataSourceDisposingEventArgs objeto é definida como true para direcionar o ObjectDataSource para não chamar o Dispose método no objeto .

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

O exemplo de código a seguir fornece o exemplo de objeto de negócios de camada intermediária que o exemplo de código anterior usa. O exemplo de código consiste em um objeto de negócios básico, definido pela EmployeeLogic classe , que é uma classe com estado que encapsula a lógica de negócios. Para obter um exemplo de trabalho completo, você deve compilar esse código como uma biblioteca e usar essas classes de uma página de ASP.NET (.aspx arquivo).

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

O exemplo a seguir mostra como manipular o ObjectDisposing evento ao usar um ObjectDataSource controle com uma classe 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;
}

Comentários

O ObjectDisposing evento sempre é gerado antes que a instância do objeto de negócios seja descartada. Se o objeto de negócios implementar a IDisposable interface, o Dispose método será chamado depois que esse evento for gerado.

Manipule o ObjectDisposing evento para chamar outros métodos no objeto, definir propriedades ou executar a limpeza específica do objeto antes que o objeto seja destruído. Uma referência ao objeto é acessada pela ObjectInstance propriedade , que é exposta pelo ObjectDataSourceEventArgs objeto .

Ao usar um ObjectDataSource controle com uma classe LINQ to SQL, você deve cancelar o descarte da classe de contexto de dados em um manipulador para o ObjectDisposing evento. Essa etapa é necessária porque o LINQ to SQL dá suporte à execução adiada, enquanto o ObjectDataSource controle tenta descartar o contexto de dados após a operação Selecionar.

Para obter mais informações sobre como lidar com eventos, consulte Manipulando e levantando eventos.

Aplica-se a

Confira também