2012-01-01 67 views
5

我想知道我的服務層應該知道我的存儲庫有多少?在過去的項目中,我總是返回列表併爲每個需要的東西提供了一個方法。與NHibernate的庫模式?

因此,如果我需要返回所有具有5將是方法Id的行。我有創建,更新,刪除和其他NHibernate選項的通用資料庫,但查詢我不。

現在我開始爲我拔腿就跑到具有爲每個個案這麼多方法的問題,使用起來更加的IQueryable。

說,如果我需要返回所有具有一定的編號,需要3個表是哪裏渴望加載,這將是一個新的方法。如果我需要一個特定的Id並且不需要加載,那將是一個單獨的方法。

所以,現在我想,如果我的方法,做where子句的一部分,並返回IQueryable的話,我可以在結果添加(即,如果我需要做的預先加載)。

與此同時,雖然現在這將使該服務層更多地瞭解存儲庫層的,我再也不能切換出庫容易,因爲現在我在服務層有特定的NHibernate的。

我也不確定這會如何影響嘲笑。

所以現在我想知道如果我沿着這條路走下去,如果需要的庫,因爲它現在好像他們已經被混合在一起。

編輯

如果我擺脫我的倉庫中,只是有會議在我服務層有一個點,有工作類的單位呢?

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(); 
      } 

     } 

回答

4

每個人都有一個意見如何使用存儲庫,什麼抽象等Ayende Rahien已經得到了幾個關於這個問題的好帖子:Architecting in the pit of doom: The evils of the repository abstraction layerRepository is the new Singleton。這些給你一些很好的理由,你爲什麼不應該嘗試在NHibernate的ISession之上創建另一個抽象。

+0

我會更多地關注它。得到我的是我喜歡服務層不知道關於數據庫的任何事情的想法,這使得單元測試(如果我需要的話)更容易並且易於切換出ORM。你如何處理這些情況? – chobo2 2012-01-02 22:15:32

+0

我也想知道如果我擺脫了倉庫是否有一點指向我的工作單位班呢?請參閱編輯 – chobo2 2012-01-02 23:14:45

+0

您可以使用UnitOfWork來包裝會話,甚至直接使用NH會話。至於單元測試,您可以使用內存數據庫進行單元測試**,使用** NHiberate。這裏有一篇關於Ayende的文章:http://ayende.com/blog/3983/nhibernate-unit-testing – 2012-01-03 06:27:08

2

關於NHibernate的一點是,如果不嘗試將它抽象出來,它會給你最多的東西。使你的服務層依賴NHibernate不一定是壞事。它使您可以控制會話,緩存和其他NHibernate功能,從而使您可以提高性能,更不用說將您從所提到的所有冗餘包裝代碼中拯救出來。

+1

添加到這樣的回答:NHibernate的會話是的UnitOfWork – ivowiblo 2012-01-02 23:36:00

+1

這就是爲什麼我想知道如果有一個點到的UnitOfWork類我,如果我不使用存儲庫模式做? – chobo2 2012-01-03 18:50:31