2010-09-18 38 views
9

Tôi đã thấy nhiều triển khai trên web của những người quản lý các phiên NHibernate và các giao dịch của họ trong một HttpModule.Quản lý phiên và giao dịch NHibernate trong HttpModule

Các HttpModule:

  1. tạo ra một phiên vào lúc bắt đầu yêu cầu
  2. kết thúc tốt đẹp toàn bộ yêu cầu trong một giao dịch
  3. cam kết giao dịch vào cuối yêu cầu

Nếu mọi người sử dụng chiến lược này, họ sẽ xử lý các tình huống sau:

  1. yêu cầu đến trong
  2. lấy đối tượng từ cơ sở dữ liệu
  3. cập nhật đối tượng
  4. đối tượng không xác nhận
  5. thay đổi đối với đối tượng là vẫn kiên trì vì các giao dịch được thực hiện trong HttpModule.

Dường như không có cách nào tốt để khôi phục giao dịch trong trường hợp trên. Kế hoạch duy nhất tôi có thể đưa ra là:

  1. viết xác nhận của mình theo cách bảo đảm thành công trước khi cập nhật đối tượng miền của tôi (lấy xác nhận của tôi ra khỏi mô hình miền).
  2. quản lý giao dịch của tôi gần hơn với logic nghiệp vụ của tôi và vứt bỏ ý tưởng làm việc đó một cách minh bạch trong một HttpModule. (Tôi đã nhìn thấy một vài bài đăng đề xuất điều này)

Thấy rất nhiều người dường như đang sử dụng phương pháp HttpModule Tôi hy vọng có cách thứ ba để quản lý kịch bản này mà tôi chưa từng nghĩ đến ?

+0

Tôi cũng nói đến cùng một câu hỏi gần đây. Tôi bắt đầu với NHibernate trên một số dự án. Cách tiếp cận cuối cùng của tôi là sử dụng Autofac cho IOC và sử dụng HttpRequestScope cho các phiên. Và tất cả các hoạt động giao dịch trên cấp độ Kho lưu trữ doanh nghiệp. Có lẽ nó không phải là tốt nhất, nhưng nó làm việc tốt cho bây giờ .. – Elph

+0

Xác nhận các thay đổi thay vì xác nhận các thay đổi được áp dụng cho thực thể là dễ dàng hơn nhiều. – Paco

+0

Bạn có tìm thấy câu trả lời cho điều này không? – Rippo

Trả lời

2

Bạn có thể sử dụng một số loại xử lý ngoại lệ toàn cầu. Bây giờ tôi đang sử dụng System.AppDomain.CurrentDomain.UnhandledException. Trong trình xử lý này, bạn sẽ cần gọi Transaction.Rollback(); Và cũng có thể điều chỉnh thiết lập một số cờ (cũng chỉ tồn tại trong thời gian yêu cầu hiện tại), điều đó có nghĩa là bạn cần phải thực hiện giao dịch hoặc quay lại. Điều này có thể làm cho mã rõ ràng hơn.

Sửa Alternativly bạn có thể sử dụng Lỗi sự kiện của HttpApplication

public class HelloWorldModule : IHttpModule 
{ 
    void Init(HttpApplication application) 
    { 
     application.BeginRequest += 
      (new EventHandler(this.Application_BeginRequest)); 
     application.EndRequest += 
      (new EventHandler(this.Application_EndRequest)); 
     //this is it 
     applicaiton.Error += 
      (new EventHandler(this.Application_Error)); 
    } 
Các vấn đề liên quan