2008-12-05 20 views
10

Chúng tôi đang sử dụng NHibernate để quản lý sự kiên trì của chúng tôi trong một cửa sổ mô-đun phức tạp hình thức ứng dụng - nhưng một ý nghĩ cứ làm phiền tôi. Chúng tôi hiện đang mở một phiên khi khởi chạy và mở tất cả các đối tượng thông qua phiên đó. Tôi lo lắng rằng tất cả các đối tượng nạp được tải vào bộ nhớ cache phiên NHibernate, để họ không thể được thu thập rác, và cuối cùng chúng tôi sẽ kết thúc với toàn bộ cơ sở dữ liệu trong bộ nhớ. Điều này không bao giờ xảy ra với các ứng dụng web vì yêu cầu trang web (và thậm chí yêu cầu Ajax tốt hơn) đại diện cho giao dịch ngắn ngủi hoàn hảo để một phiên có thể được mở và đóng để xử lý từng yêu cầu.Làm cách nào để quản lý các phiên NHibernate trong một ứng dụng biểu mẫu Windows đã tồn tại lâu dài?

Tuy nhiên nếu tôi tải một cây đối tượng trong ứng dụng biểu mẫu của tôi và sau đó đặt vào ngăn điều hướng trên màn hình, chúng có thể giữ nguyên trạng thái của ứng dụng - và tại bất kỳ thời điểm nào người dùng có thể nhấp vào chúng mã của chúng tôi cần điều hướng các mối quan hệ đối tượng đến các đối tượng khác (chỉ hoạt động trong một phiên NHibernate).

Trình đọc StackOverflow làm gì để giữ các lợi ích của NHibernate mà không có các vấn đề tôi mô tả?

Trả lời

1

tôi có thể thấy một vài lựa chọn:

  1. Háo hức nạp cây đối tượng (trong đó, từ những gì tôi có thể thu thập từ documentation là mặc định)
  2. Tháo đối tượng, đánh chặn "nhấp chuột "sự kiện và tải dữ liệu từ cơ sở dữ liệu, sau đó, với một phiên mới. Điều này buộc bạn phải tự chăm sóc các bộ sưu tập, thay vì dựa vào nhibernate, có thể nằm ngoài phạm vi của câu hỏi (yêu cầu lợi ích của NHibernate, một trong số đó là quản lý bộ sưu tập)
4

Ayende và công ty thường khuyên bạn nên sử dụng một phiên cho mỗi "cuộc trò chuyện". Điều này thường làm cho tuổi thọ phiên cuối cùng cho các hoạt động rất ngắn, do đó, nó hoạt động giống như một ứng dụng web.

Đối với trường hợp cây của bạn, bạn có thể sử dụng giải pháp của Bruno # 2 tốt. Các đối tượng có thể được ánh xạ lazily. Sau đó, mỗi lần bạn cần truy cập bộ sưu tập con, bạn bắt đầu cuộc trò chuyện và kết nối lại phụ huynh qua ISession.Lock. Sau đó, khi databinding được thực hiện, đóng phiên đó. Không quá nhiều chi phí để duy trì, chỉ cần một vài dòng mã trong bất kỳ hình thức nào cần phải thực hiện một cuộc trò chuyện; bạn có thể mở rộng Biểu mẫu và các điều khiển bạn đang sử dụng để thực hiện việc này tự động nếu bạn cảm thấy sassy.

Phần phức tạp, sau đó, là các chỉnh sửa đồng thời từ các phiên khác nhau. Chúng ta hãy không đến đó!

+1

Đây là một bài viết có mẫu hay về cách triển khai phiên cho mỗi cuộc hội thoại trong ứng dụng kiểu máy tính để bàn: http://msdn.microsoft.com/en-us/magazine/ee819139.aspx –

3

Tôi mở một phiên khi tôi cần, và tôi sẽ đóng nó khi tôi biết rằng tôi sẽ không cần nó nữa. Ví dụ, ví dụ, nếu tôi có một biểu mẫu cho phép tôi chỉnh sửa thông tin khách hàng, tôi sẽ mở một phiên khi biểu mẫu được khởi tạo và tôi sẽ đóng Phiên khi biểu mẫu được đóng lại. Ví dụ: Khi tôi có 2 lần mở biểu mẫu đó, tôi cũng có 2 phiên mở.

1

Bạn có thể có một cái nhìn để bài viết của tôi về cách sử dụng uNHAddins để làm việc với phiên mỗi cuộc nói chuyện trong một ứng dụng Windows Forms (uNHAddins là một dự án với một số additionsns để NHibernate do Fabio Maulo, hiện nay NH Chì)

Các bài viết đầu tiên này là

http://gustavoringel.blogspot.com/2009/02/unhaddins-persistence-conversation-part.html

Từ đó bạn có liên kết đến uNHAddins cốp xe.

Các vấn đề liên quan