2012-01-01 36 views
5

Tôi tự hỏi lớp dịch vụ của mình biết bao nhiêu về kho lưu trữ của tôi? Trong quá khứ, tôi luôn luôn quay trở lại danh sách và có một phương pháp cho mỗi thứ tôi cần.Mẫu lưu trữ với NHibernate?

Vì vậy, nếu tôi cần trả lại tất cả các hàng có Id là 5 sẽ là phương thức. Tôi có kho chung để tạo, cập nhật, xóa và các tùy chọn NHibernate khác nhưng để truy vấn tôi thì không.

Bây giờ tôi bắt đầu sử dụng nhiều IQueryable hơn khi tôi bắt đầu gặp phải các vấn đề về việc có quá nhiều phương pháp cho từng trường hợp.

Giả sử tôi cần trả lại tất cả những gì có một Id nhất định và cần 3 bảng mà ở đó mong muốn tải lên đây sẽ là một phương pháp mới. Nếu tôi cần một Id nhất định và không tải trọng mong muốn, đó sẽ là một phương pháp riêng biệt. Vì vậy, bây giờ tôi đang suy nghĩ nếu tôi phương pháp mà không một phần khoản khoản và trả về IQueryable sau đó tôi có thể thêm vào kết quả (tức là nếu tôi cần phải tải háo hức).

Đồng thời, điều này làm cho lớp dịch vụ nhận thức rõ hơn về lớp lưu trữ và tôi không còn có thể chuyển kho lưu trữ dễ dàng như bây giờ tôi có NHibernate cụ thể trong lớp dịch vụ.

Tôi cũng không chắc chắn điều đó sẽ ảnh hưởng như thế nào.

Vì vậy, bây giờ tôi tự hỏi nếu tôi đi xuống tuyến đường này nếu kho là cần thiết vì nó bây giờ có vẻ như họ đã được pha trộn với nhau.

Sửa

Nếu tôi thoát khỏi kho lưu trữ của tôi và chỉ có phiên giao dịch trong lớp dịch vụ của tôi là có một điểm để có một đơn vị của lớp công việc sau đó?

public class UnitOfWork : IUnitOfWork, IDisposable 
    { 
     private ITransaction transaction; 
     private readonly ISession session; 

     public UnitOfWork(ISession session) 
     { 
      this.session = session; 
      session.FlushMode = FlushMode.Auto; 
     } 

     /// <summary> 
     /// Starts a transaction with the database. Uses IsolationLevel.ReadCommitted 
     /// </summary> 
     public void BeginTransaction() 
     { 
      transaction = session.BeginTransaction(IsolationLevel.ReadCommitted); 
     } 

     /// <summary> 
     /// starts a transaction with the database. 
     /// </summary> 
     /// <param name="level">IsolationLevel the transaction should run in.</param> 
     public void BeginTransaction(IsolationLevel level) 
     { 
      transaction = session.BeginTransaction(level); 
     } 

     private bool IsTransactionActive() 
     { 
      return transaction.IsActive; 
     } 

     /// <summary> 
     /// Commits the transaction and writes to the database. 
     /// </summary> 
     public void Commit() 
     { 
      // make sure a transaction was started before we try to commit. 
      if (!IsTransactionActive()) 
      { 
       throw new InvalidOperationException("Oops! We don't have an active transaction. Did a rollback occur before this commit was triggered: " 
                  + transaction.WasRolledBack + " did a commit happen before this commit: " + transaction.WasCommitted); 
      } 

      transaction.Commit(); 
     } 

     /// <summary> 
     /// Rollback any writes to the databases. 
     /// </summary> 
     public void Rollback() 
     { 
      if (IsTransactionActive()) 
      { 
       transaction.Rollback(); 
      } 
     } 

     public void Dispose() // don't know where to call this to see if it will solve my problem 
     { 
      if (session.IsOpen) 
      { 
       session.Close(); 
      } 

     } 

Trả lời

4

Mọi người đều có ý kiến ​​về cách sử dụng kho lưu trữ, nội dung cần hiển thị vv. Ayende Rahien có vài bài đăng hay về sự cố: Architecting in the pit of doom: The evils of the repository abstraction layerRepository is the new Singleton. Những người cung cấp cho bạn một số lý do khá tốt lý do tại sao bạn không nên cố gắng tạo ra một trừu tượng khác trên đầu trang của NHibernate của ISession.

+0

Tôi sẽ xem xét kỹ hơn. Điều mà tôi nhận được là tôi thích ý tưởng rằng lớp dịch vụ không biết gì về cơ sở dữ liệu giúp dễ dàng kiểm tra đơn vị (nếu tôi cần) và dễ dàng chuyển đổi các ORM. làm thế nào để bạn xử lý các kịch bản này? – chobo2

+0

Tôi cũng tự hỏi nếu tôi loại bỏ các kho lưu trữ có một điểm để đơn vị của tôi về lớp công việc sau đó? Xem Edit – chobo2

+0

Bạn có thể sử dụng UnitOfWork chỉ để gói phiên, hoặc thậm chí sử dụng phiên NH trực tiếp. Đối với thử nghiệm đơn vị, bạn có thể sử dụng cơ sở dữ liệu trong bộ nhớ để kiểm tra đơn vị ** với ** NHiberate. Đây là một bài viết về nó từ Ayende: http://ayende.com/blog/3983/nhibernate-unit-testing –

2

Điều về NHibernate là nó mang lại cho bạn nhiều nhất nếu bạn không cố gắng trừu tượng hóa nó. Làm cho lớp dịch vụ của bạn phụ thuộc vào NHibernate không nhất thiết phải là một điều xấu. Nó cho phép bạn kiểm soát các phiên, bộ nhớ đệm và các tính năng NHibernate khác, và do đó cho phép bạn thực hiện hiệu suất, không kể đến việc tiết kiệm bạn khỏi tất cả các mã gói dự phòng mà bạn đã đề cập.

+1

Thêm vào câu trả lời này: Phiên NHibernate IS UnitOfWork – ivowiblo

+1

Đó là lý do tại sao tôi tự hỏi nếu có một điểm cho lớp UnitOfWork tôi đã thực hiện nếu tôi không sử dụng mẫu lưu trữ? – chobo2

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