1

我目前正在嘗試推行項目庫我工作的幾個不同的方法,目前有通用的方法,一個存儲庫上是這樣的:具有通用方法的單個存儲庫...壞主意?

public interface IRepository 
{ 
    T GetSingle<T>(IQueryBase<T> query) where T : BaseEntity; 

    IQueryable<T> GetList<T>(IQueryBase<T> query) where T : BaseEntity; 

    T Get<T>(int id) where T : BaseEntity; 

    int Save<T>(T entity) where T : BaseEntity; 

    void DeleteSingle<T>(IQueryBase<T> query) where T : BaseEntity; 

    void DeleteList<T>(IQueryBase<T> query) where T : BaseEntity; 
} 

這樣我可以只需將一個存儲庫注入一個類並使用它來獲得我需要的任何東西。

(順便說一下,我用流利的NHibernate作爲我的ORM,與會話,每個Web請求的模式,並利用注入我的Structuremap庫)

這似乎爲我工作 - 方法我在這個存儲庫上定義了我需要的一切。但是,在我所有的網絡搜索中,我還沒有發現其他人使用這種方法,這讓我覺得我錯過了一些東西......這是否會導致我的問題,因爲我增長了我的應用程序?

我讀了很多人在討論如何爲每個根實體創建一個存儲庫 - 但是如果我用一些接口標識根實體並且限制泛型方法只允許實現那個接口的類,那麼我是不是實現了同樣的事情?

提前感謝任何產品。

+0

這是一個基於觀點的問題。到目前爲止所有的答案都一樣。經過少許修改,這個更適合https://softwareengineering.stackexchange.com/。 – 2017-10-09 08:07:28

回答

4

。儘管如此,我並沒有從我的存儲庫中公開IQueryableIQueryOver

另外我只使用我的存儲庫作爲查詢接口。我通過將要注入到存儲庫的Session(工作單元)對象進行保存,更新和刪除操作。這使我可以跨不同的存儲庫進行交易。

我發現我絕對不能做任何事情,從一個通用的存儲庫,但他們肯定是在一些情況下有用。

要回答你的問題,雖然我不認爲有一個單一的通用知識庫是不好的主意,如果你可以通過它。在我的實施中,這是行不通的,但如果它適合你,那就太好了。我認爲這歸結於最適合你的東西。我認爲你永遠不會找到適合你情況的解決方案。我發現混合解決方案對我來說最合適。

+0

我使用這種方法,但我確實公開了IQueryOver,甚至從我的存儲庫中公開了Session,這讓我有能力讓NHibernate進入我的控制器或幫助器類。適合我。 – Rippo 2012-02-22 05:28:06

0

我已經在一些項目上成功地使用了這種方法。對於每個BaseEntity,將許多IRepository<T>傳遞給我的服務圖層會變得很繁瑣,但它很有用。有一兩件事我想改變的就是把界面上的where T :,而不是我目前使用兩種通用的存儲庫(IRepository<T>)和自定義(ICustomRepository)的混合方法

public interface IRepository<T> where T : BaseEntity 
3

我在我的項目中做了類似的事情。一個缺點是你必須小心,你不要創建一個選擇N + 1的錯誤。我通過傳遞一個單獨的屬性列表來熱切地獲取它。

你會聽到的主要論點是這樣的包裝你的ORM是一個漏洞抽象。你仍然需要圍繞一些像「select n + 1」這樣的「陷阱」進行編碼,而且你不能充分利用NH的緩存支持(至少不是沒有額外的代碼)。

這是關於Ayende博客上這種方法的優缺點的good thread。他或多或少反對這種模式,但也有一些反駁的觀點。

2

我實現這類倉庫的NHibernate的。你可以看到例子here

在這種實現你能做到預先加載和抓取。問題在於,對於NH,您通常需要能夠使用QueryOver或Criteria API來訪問數據(不幸的是,LINQ提供程序還遠遠不夠完美)。有了這樣的抽象,這可能是一個導致漏洞抽象的問題。

2

其實我已經從工作界面庫模式和創建單位搬走了 - 我覺得限制。

除非您預計數據存儲即從DB將文本文件或XML的改變 - 它從來沒有的情況下對我來說,你是最好關閉用的Isession。你正試圖抽象你的數據訪問,這正是NHibernate所做的。使用存儲庫限制非常酷的功能,如Fetch(),FetchMany()期貨等.ISession是您的工作單位。

擁抱NHibernate和直接使用的Isession!

+1

我發現存儲庫模式使單元測試使用存儲庫的代碼更容易。 – 2012-02-22 12:54:05

+0

@ColeW - 我在測試中在內存數據庫中使用sqlite。它速度很快,我不需要在ISession之上創建額外的圖層。我曾經使用IRepository,但是一旦我切換到ISession,使用NHibernate更容易。 – 2012-02-22 16:42:23

+0

@ToniParviainen我在說單元測試。你在談論的是集成測試。 – 2012-02-22 17:14:17

相關問題