2010-08-06 11 views
24

Todo implementación de IHttpModule que he visto apariencia siguiente:¿Cómo desechar IHttpModule correctamente?

class HttpCompressionModule : IHttpModule 
{ 
    public void Init(HttpApplication application) 
    { 
    application.SomeEvent += OnSomeEvent; 
    } 

    private void OnSomeEvent(Object source, EventArgs e) 
    { 
    // ... 
    } 

    public void Dispose() 
    { 
    // nothing here !!! 
    } 
} 

Me pregunto por qué es el método Dispose siempre vacía? ¿No debería darse de baja el evento que suscribimos en el método Init?

Respuesta

23

El ciclo de vida de un HttpModule está estrechamente integrado con el ciclo de vida de una aplicación Http. Las instancias de HttpModule se generan cuando la aplicación se inicia y se destruye cuando se elimina la aplicación.

En este caso, no tiene sentido anular la suscripción al evento porque el publicador (HttpApplication) se está eliminando de todos modos. Por supuesto, en una situación en la que el editor no estaba siendo eliminado, desenganchar el controlador de eventos sería lo correcto.

+4

Probé la anulación del registro de botar y me InvalidOperationException con el mensaje "Los controladores de eventos solo se pueden unir a los eventos HttpApplication durante IHttpModule inicialización." – angularsen

3

El método de eliminación no estará vacío si necesita crear instancias de objetos IDisposable dentro de su módulo.

class HttpCompressionModule : IHttpModule 
{ 
    private IDisposalbe _myResource; 

    public void Init(HttpApplication application) 
    { 
    _myResource = new MyDisposableResource(); 
    application.SomeEvent += OnSomeEvent; 
    } 

    private void OnSomeEvent(Object source, EventArgs e) 
    { 
    // ... 
    myResource.DoSomething(); 
    } 

    public void Dispose() 
    { 
    _myResource.Dispose(); 
    } 
}