2009-08-18 70 views
2

好吧,我只是進入nhibernate(使用流利)。我喜歡它的原因使用nHibernate和存儲庫模式,需要一些方向

一件事是,我可以使用庫模式(從NHibernate的犀牛博客讀到它)。

基本上使用泛型,我可以創建,將工作翻過我所有的數據庫表的方法。

public interface IRepository<T> 
    { 
     T GetById(int id); 
     ICollection<T> FindAll(); 
     void Add(T entity); 
     void Remove(T entity); 
    } 


public class Repository<T> : IRepository<T> 
    { 

     public ISession Session 
     { 
      get 
      { 
       return SessionProvider.GetSession(); 
      } 
     } 


     public T GetById(int id) 
     { 
      return Session.Get<T>(id); 
     } 

     public ICollection<T> FindAll() 
     { 
      return Session.CreateCriteria(typeof(T)).List<T>(); 
     } 

     public void Add(T t) 
     { 
      Session.Save(t); 
     } 

     public void Remove(T t) 
     { 
      Session.Delete(t); 
     }  

    } 

然後我繼承庫類,然後我可以添加特定於該實體的方法。

當試圖添加一個更新的方法,有人提到,庫模式是假設作用於收藏?我在這裏看錯了嗎?爲什麼我無法創建更新方法?

我嘗試添加一個更新的方法,但我很困惑,我將如何處理會話,並更新數據庫?

我想爲每個實體的所有我的數據庫訪問一個地方,所以UserRepository將所有基本的CRUD然後也許一些其他的方法,如GetUserByEmail()等

回答

2

不要使用存儲庫模式 - 使用改爲UnitOfWork模式,並將定義的查詢IC標準傳遞給ISession。基本上,回購模式包裝了一些不需要用NH包裝的東西。

http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx更多信息

+4

我認爲其誤導性暗示的工作和資源庫模式的單元是可以互換的,因爲他們解決不同的問題。我對Ayende的這篇文章很熟悉,雖然我確實認爲它確實有一些事實,但請記住它只是一個意見,不應該作爲事實陳述。 – 2009-08-18 22:24:10

+0

ight,但是如果你正在學習NH,那麼從Repository模式開始(在每次調用repo.Update()時都會刷新)是一個壞習慣。或者你最終可能會寫出一些怪異的Repo和UoW的混合體,看起來像是Repo,但仍然需要被沖刷掉,或者錯過了這個不連貫的UoW的偉大。在我看來,宅基地已經拿起了一些教程,正在邁出他的第一步,並且爲了他所需要的走向稍微錯誤的路線,以及學習NH的最佳途徑是什麼。 – mcintyre321 2009-08-18 22:37:24

+0

但是,你說得對,我聽起來像是一個全面的聲明。回購模式在正確的情況下非常有用。我應該說「在這種情況下,國際海事組織的回購模式正在包裝的東西......」 – mcintyre321 2009-08-18 22:38:56

1

也許你聽錯了或者有人mispoke - Repository模式應該暴露收集喜歡的行爲,而不是集合進行操作。就像您可以添加,刪除和搜索集合中的項目一樣,您的存儲庫提供了對數據庫有效的保存,刪除和搜索操作。

我建議你下載的代碼S#arp Architecture。它包含一個存儲庫實現,您可以輕鬆地重用。如果你不想依賴它,至少你可以花一些時間研究它們的實現,以便你更好地瞭解如何自己來實現它。

+0

S#arp架構現在位於http://wiki.sharparchitecture.net/ – cori 2013-08-01 15:35:25