2008-09-18 18 views
11

Tôi thấy khó quản lý phiên của bạn trong một ứng dụng dành cho máy tính để bàn, bởi vì bạn không thể tận dụng lợi thế của một liên kết rõ ràng như HttpContext. Vậy làm cách nào để bạn quản lý thời gian hoạt động của phiên để tận dụng tải chậm nhưng không có một phiên mở cho toàn bộ ứng dụng?Chiến lược quản lý phiên của bạn cho NHibernate trong các ứng dụng dành cho máy tính để bàn là gì?

Trả lời

3

Tôi nghĩ nó sẽ được thiết kế cho các đối tượng của bạn. Vì việc tải chậm có thể được thực thi ở cấp độ đối tượng, bạn có thể tận dụng lợi thế của thực tế đó khi bạn nghĩ về quản lý phiên.

Ví dụ: tôi có một loạt các đối tượng tải dữ liệu phong phú và lười biếng và tôi có chế độ xem lưới/tóm tắt và chế độ xem chi tiết cho chúng. Trong chế độ xem tóm tắt lưới, tôi không sử dụng phiên bản được tải xuống của đối tượng. Tôi sử dụng một đối tượng thay thế để trình bày dữ liệu đó, và đối tượng thay thế đó không được tải xuống.

Mặt khác, khi người dùng chọn bản ghi đó để xem/chỉnh sửa và bạn nhập chế độ xem chi tiết nhiều trang của đối tượng, đó là khi chúng tôi áp dụng tải chậm cho đối tượng cụ thể. Dữ liệu hiện được tải xuống tùy thuộc vào chi tiết nào được xem chỉ theo yêu cầu. Bằng cách đó, phạm vi phiên của tôi đang được mở để tải xuống chỉ kéo dài miễn là chế độ xem chi tiết đang được sử dụng.

2

Như bạn đã nói trước đây, bạn không thể sử dụng đường viền của HttpRequest, nhưng bạn có thể hiểu "HttpRequest" là gì trong ứng dụng máy tính để bàn của mình.

Hãy để tôi giải thích. Thông thường HttpRequest của bạn sẽ là một bộ điều khiển cho một hành động và bạn sẽ giới hạn phiên của bạn với hành động cụ thể đó. Bây giờ trong ứng dụng máy tính để bàn của bạn "bộ điều khiển" (sự kiện) có thể nhỏ hơn, nhưng như @ Jon đã nói, một cửa sổ có thể dễ dàng đại diện cho một ranh giới: bạn làm việc với những thứ ở đó, hãy để chúng vào phiên của bạn.

0

Có lẽ chúng ta có thể nghĩ về thiết lập mẫu Command. Mỗi sự kiện có ý nghĩa sẽ nạp và kích hoạt một Lệnh, và thực hiện nó. Việc thực hiện AbstractCommand.Execute() cơ sở chịu trách nhiệm khởi tạo phiên, gói giao dịch, gọi triển khai SomeCommand._Execute() cụ thể và đóng tất cả các công cụ.

Dù sao đi nữa, điều này còn xa khi tôi tải đối tượng của mình và tôi (muốn) đối phó với các trường hợp đơn giản (tôi đặc biệt đề cập đến tải lười ở đây).

Có thể thực hiện một số hành vi tự động mở/tự động đóng khác không? Điều này nên được thực hiện bằng cách làm cho lớp bền vững nhạy cảm với nhu cầu truy vấn của các lớp cao hơn, ngay cả trong các trường hợp tiềm ẩn như các trình kích hoạt tải lười. Để đóng kết nối, lớp kiên trì có thể đóng sau một khoảng thời gian chờ nhất định (10 giây?) Của DB không hoạt động. Tôi biết, điều này không phải là sắc nét. Nhưng nó sẽ thực sự làm cho các lớp cao hơn bền bỉ bất khả tri.

Cảm ơn, Marcello

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