2010-08-06 36 views
24

Tất cả thực hiện IHttpModule Tôi đã nhìn thấy vẻ sau:Cách xử lý IHttpModule chính xác?

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

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

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

Tôi tự hỏi tại sao là phương pháp Dispose luôn có sản phẩm nào? Chúng tôi có nên hủy đăng ký sự kiện mà chúng tôi đăng ký theo phương thức Init không?

Trả lời

23

Vòng đời của một HttpModule được tích hợp chặt chẽ với vòng đời của một HttpApplication. Các cá thể của HttpModule được tạo ra khi ứng dụng được khởi động và hủy khi ứng dụng được xử lý.

Trong trường hợp này, không có điểm nào trong việc hủy đăng ký sự kiện vì nhà xuất bản (HttpApplication) đang được xử lý. Tất nhiên, trong một tình huống mà các nhà xuất bản đã không được xử lý, unhooking xử lý sự kiện sẽ là điều phải làm.

+4

Tôi đã cố gắng hủy đăng ký vứt bỏ và nhận InvalidOperationException với thông báo "Trình xử lý sự kiện chỉ có thể bị ràng buộc với các sự kiện HttpApplication trong quá trình khởi tạo IHttpModule". – angularsen

3

Phương pháp vứt bỏ sẽ không trống nếu bạn cần khởi tạo các đối tượng IDisposable bên trong mô-đun của mình.

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(); 
    } 
} 
Các vấn đề liên quan