2011-06-21 5 views
9

Khi thực hiện các tác vụ nền trong Dịch vụ Windows, tôi đã sử dụng HybridHttpOrThreadLocalScoped để lưu trữ các trạng thái của NHibernate ISessions.Làm thế nào để phát hành các đối tượng HybridHttpOrThreadLocalScoped trong StructureMap?

Vì trong Windows Server không có HTTPCtext, tôi tự hỏi nếu chỉ gọi ReleaseAndDisposeAllHttpScopedObjects() là đủ để giải phóng trường hợp ISession cho chuỗi đó?

+0

Bạn đã thử điều này chưa? Thế kết quả là gì? – thekip

+0

Tôi không nghĩ là vậy. Tôi chỉ cho nó một thử và có một NullReferenceException mà tôi đoán là bởi vì không có một HttpContext. Vì vậy, Không, phương pháp đó chắc chắn không phải là cách thích hợp để phát hành phiên. – Roman

Trả lời

15

Tôi đã tìm hiểu cách trả lời câu hỏi này. Phương thức ReleaseAndDisposeAllHttpScopedObjects() được ObjectFactory trưng ra thực sự quan tâm đến HttpContext và do đó các ứng dụng web.

Lớp HybridLifeCycle từ không gian tên Structuremap.Pipeline cho phép truy cập trực tiếp vào các đối tượng được lưu trữ trong bộ nhớ ThreadLocal và xử lý chúng. Dưới đây là ví dụ:

Action.For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>(); 

Mã trên đăng ký kiểu được cung cấp và lưu trữ các cá thể của nó trong lưu trữ HttpContext hoặc ThreadLocal. Nó luôn luôn là một ý tưởng tốt để kế thừa các loại từ IDisposable. Như vậy trong ví dụ này UnitOfWork cũng là một IDisposable.

new HybridLifecycle().FindCache().DisposeAndClear(); 

Bây giờ để xử lý các đối tượng được lưu trữ regardsless của một ứng dụng web hoặc cửa sổ dịch vụ đường dây trên là đủ để xử lý các UnitOfWork thay vì ReleaseAndDisposeAllHttpScopedObjects() phương pháp. Tôi hi vọng điêu nay se giup được ai đo.

+0

Cảm ơn, điều đó thực sự đã giúp tôi! – manu08

+0

Bạn đã lưu ngày của tôi với điều này, cảm ơn! –