2009-03-16 33 views
8

Tôi có một lớp kho lưu trữ định nghĩa một số phương thức Get/Save/Delete cơ bản. Bên trong, tôi sử dụng NHibernate để làm công việc trên các thực thể kinh doanh của tôi. Ví dụ:Cách tốt nhất để sử dụng NHibernate với mô hình kho lưu trữ

Public Class SecurityRepositoryNHibImpl : Implements ISecurityRepository 
    Public Function GetUser(ByVal UUID As System.Guid) As Entities.User Implements ISecurityRepository.GetUser 
     Dim eUser As Entities.User 
     Using session As ISession = NHibernateHelper.OpenSession() 
      eUser = session.Get(Of Entities.User)(UUID) 
     End Using 
     Return eUser 
    End Function 
End Class 

Tuy nhiên, trên lớp người dùng của tôi, tôi có một số thuộc tính và tập hợp các đối tượng lý tưởng khác mà tôi muốn tải. Nhưng tất nhiên, ISession được tạo ra và xử lý trong kho, mà tôi đoán là tại sao, bên ngoài đó, khi tôi cố gắng truy cập vào các thuộc tính đó, tôi nhận được lỗi "Không thể khởi tạo proxy - không phiên".

Tùy chọn duy nhất của tôi sau đó là tắt tải chậm khi sử dụng kho lưu trữ? Hoặc là nó có thể (hoặc chỉ là ngu ngốc) bằng cách nào đó có được phiên vào phạm vi trong lớp kinh doanh?

Tôi thích mô hình kho lưu trữ, và NHibernate đang phát triển trên tôi (sau nhiều lần thất vọng ban đầu để làm cho nó hoạt động), vậy cách tốt nhất mà bạn đã tìm thấy khi sử dụng chúng cùng nhau là gì?

Tôi khá mới với mô hình NHibernate và kho lưu trữ nói chung (tại nơi làm việc chúng tôi vẫn chủ yếu sử dụng VB6!), Vì vậy hãy tha thứ cho những gì có thể là một câu hỏi ngớ ngẩn. Cảm ơn.


@mookid: Cảm ơn bạn, điều đó thực sự hữu ích nhưng tôi có thể để nó mở lâu hơn một chút. Đó là back-end cho một dịch vụ web WCF, và tất cả các chức năng sẽ được bối cảnh cho mỗi cuộc gọi, vì vậy một cuộc gọi phiên cuộc gọi sẽ là tốt. Chỉ cần không chắc chắn làm thế nào để có được một điều như vậy làm việc trong lớp kinh doanh, lý tưởng tôi không muốn các đối tượng kinh doanh phải giao diện trực tiếp với bất kỳ lớp NHibernate. Tôi đoán một số loại wrapper cho phiên NHibernate ít nhất tóm tắt nó đi ... Hmm, bạn đã đưa tôi đi đúng hướng ít nhất.


Có vẻ như từ khóa ở đây là "Đơn vị công việc", mà một tấn tài nguyên tồn tại trên web liên quan đến NHibernate. Cụ thể là tìm kiếm Ayende's implementation trong Rhino Commons và web Kiến trúc ứng dụng của anh ấy được đúc (no. 9 at Hibernating Rhinos), rất thông tin. Ban đầu tôi bối rối bởi vì mặc dù tôi đặt một "Đơn vị Làm việc" trong lớp kinh doanh đang trộn lẫn các mối quan tâm, but I was soon corrected.

Trả lời

12

Tạo ISession của bạn và xử lý rõ ràng trong kho lưu trữ của bạn như vậy là ok cho các dự án nhỏ và rất đơn giản - nhưng, như bạn đã phát hiện ra, nó đến ngắn khi bạn bắt đầu muốn sử dụng một số tính năng tuyệt vời mà NHibernate hỗ trợ.

Bạn có lẽ nên để cho lối sống của phiên được kiểm soát bởi một cái gì đó bên ngoài kho của bạn - ví dụ: nếu bạn đang thực hiện các ứng dụng web ASP.NET, bạn có thể muốn lưu phiên trong yêu cầu hiện tại (HttpContext.Current.Items nếu tôi nhớ chính xác) trong suốt thời gian yêu cầu web, sau đó cam kết và vứt bỏ vào cuối yêu cầu (hoặc quay lại) nếu một ngoại lệ xảy ra).

Tôi không biết cách tốt nhất để kiểm soát lối sống của phiên của bạn trong các ứng dụng ASP.NET, nhưng phải có một số cách để có mã được gọi lúc đầu và vào cuối mỗi yêu cầu. Trong ASP.NET MVC nó có thể dễ dàng thực hiện bằng cách lấy tất cả các bộ điều khiển của bạn từ một bộ điều khiển cơ sở đã overriden của nó OnActionExecutingOnActionExecuted phương pháp.

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