2008-12-13 39 views
28

Tôi hiện đang chơi đùa với các lớp HybridSessionBuilder tìm thấy trên bài đăng blog Jeffrey Palermo:NHibernate quản lý phiên trong ASP.NET MVC

http://jeffreypalermo.com/blog/use-this-nhibernate-wrapper-to-keep-your-repository-classes-simple/

Sử dụng lớp này, kho của tôi trông như thế này:

public class UserRepository : IUserRepository 
{ 
    private readonly ISessionBuilder _sessionBuilder; 

    public UserRepository(ISessionBuilder sessionBuilder) 
    { 
     _sessionBuilder = sessionBuilder; 
    } 

    public User GetByID(string userID) 
    { 
     using (ISession session = _sessionBuilder.GetSession()) 
     { 
      return session.Get<User>(userID); 
     } 
    } 
} 

Đây có phải là cách tốt nhất để quản lý phiên làm việc/nhà máy NHibernate không? Tôi đã nghe những điều về Đơn vị công việc và tạo một phiên cho mỗi yêu cầu web và xả nó vào cuối. Từ những gì tôi có thể nói, triển khai hiện tại của tôi không thực hiện bất kỳ điều nào trong số này. Về cơ bản, nó dựa vào Kho lưu trữ để lấy phiên làm việc từ nhà máy phiên và sử dụng nó để chạy các truy vấn.

Có bất kỳ cạm bẫy nào để thực hiện truy cập cơ sở dữ liệu theo cách này không?

+1

không chắc chắn về những cạm bẫy nhưng bạn có thể kiểm tra một thực hiện của các đơn vị của mô hình làm việc sử dụng Rhino.Commons qua Steve Bohlen của www.autumnofagile.net ... anh ấy xây dựng một ứng dụng MVC với NHibernate, Windsor và Rhino .Commons ... đó là một chuỗi tuyệt vời – Webjedi

Trả lời

37

Bạn không nên bọc ISession của bạn trong một tuyên bố sử dụng - điểm chuyển ISessionBuilder vào bộ dựng kho (tiêm phụ thuộc) là mã gọi có trách nhiệm kiểm soát vòng đời của ISession. Bằng cách gói nó trong một sử dụng, Dispose() được gọi là trên ISession và bạn sẽ không thể lười biếng tải đối tượng thành viên hoặc vẫn tồn tại nó.

Chúng tôi làm điều gì đó tương tự bằng cách chỉ truyền vào ISession cho trình tạo kho lưu trữ. Mã của ông Palermo, như tôi đã hiểu, chỉ đơn giản là thêm sự khởi đầu lười biếng của ISession. Tôi không nghĩ rằng đó là cần thiết bởi vì tại sao bạn sẽ mới lên một kho lưu trữ nếu bạn sẽ không sử dụng nó?

+0

Câu trả lời hay, Hãy bỏ phiếu lên hai lần nếu tôi có thể :) – UpTheCreek

10

Với ASP.Net MVC bạn muốn đảm bảo tuổi thọ của phiên được duy trì trong phương thức Hành động trên bộ điều khiển của bạn, khi bộ điều khiển của bạn đã thoát khỏi tất cả dữ liệu cần được thu thập. Tôi không chắc liệu cơ chế này có giúp được gì không.

Bạn có thể muốn xem xét S # arp Architechure là bộ thư viện và hướng dẫn để xây dựng ứng dụng ASP.Net MVC bằng nHibernate. http://code.google.com/p/sharp-architecture/

+0

Chúng tôi là cu rrently quản lý cuộc sống phiên này bằng cách sử dụng một yêu cầu bắt đầu và kết thúc yêu cầu cuộc gọi trong global.asax (bỏ qua css và js vv) Không muốn phải trang trí mọi hành động với một hướng dẫn đơn vị công việc. – Perhentian

+1

Tôi đã sử dụng Yêu cầu kết thúc lúc đầu nhưng sau đó khi xảy ra lỗi nghiêm trọng, yêu cầu đã kết thúc trang đã được hiển thị và tôi không thấy cách xử lý lỗi nào khác sau đó gửi người dùng đến trang chung. Tôi thích đóng một cách rõ ràng của phiên làm việc (Hoặc ở mức tối thiểu khi giao dịch) khi bạn di chuyển từ Bộ điều khiển sang Chế độ xem. – JoshBerke

1

Tôi sẽ không mở và đóng các phiên trên mỗi yêu cầu dữ liệu cho NHibernate. Tôi sẽ sử dụng thư viện Đơn vị công việc mà nhiều người khác đề xuất hoặc thực hiện một số đọc thêm. NHForge.org đang bắt đầu và tôi tin rằng có một số thực hành về việc thiết lập NHibernate cho một ứng dụng web chung.

Một trong những "khoảnh khắc tuyệt vời đó là những khoảnh khắc thú vị" mà tôi đã nhận được từ NHibernate đã lợi dụng việc tải các bộ sưu tập một cách lười biếng trong quá trình phát triển. Đó là một kinh nghiệm gọn gàng có thể không phải làm tất cả những người tham gia để hiển thị dữ liệu trên một số đối tượng liên quan.

Bằng cách đóng phiên như thế này, trường hợp trên không thể thực hiện được.

Có thể có điều gì đó đang diễn ra với các giao dịch.

3

Đây là thiết lập tôi đã sử dụng sau khi nghiên cứu thêm.Dường như làm việc tuyệt vời và không có mà thói quen khó chịu của việc tạo ra một ISession trên yêu cầu tập tin tĩnh giống như hầu hết những hướng dẫn trên mạng:

http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/

+0

Lý do chính xác là nó sẽ mở phiên cho các yêu cầu tệp tĩnh? –

+0

Hầu hết các giải pháp sử dụng trình xử lý yêu cầu, vì IIS 7 xử lý mọi thứ trong đường ống tích hợp, xử lý các yêu cầu đến tài nguyên tĩnh không chỉ yêu cầu trang. Do đó, trình xử lý quay lên một phiên/phiên giao dịch Nhibernate cho mỗi yêu cầu bao gồm các yêu cầu đến tài nguyên tĩnh. – Ted

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