2010-09-22 149 views
0

我想進入一個項目與ASP.NET MVC和NHibernate(新手),並尋找從DAL更快的數據訪問。存儲庫模式和數據訪問

我的解決方案將大致爲 asp.net mvc ------業務層 - 數據訪問層 ----------所有支持的基礎設施層--------- -------

我的項目是與分類和社區網站,更快的數據訪問是必須的。

我真的很喜歡KIGG的實現,但我不太確定存儲庫模式是否適合更快的數據訪問。

我看過S#arp Architecture,它對我來說太大了。

在倉庫也是,我打算從KIGG實施分流,並使用以下爲檢索對象

IRepository {

無效添加(); void Remove();

public IQueryable FindAll(Func exp) { return GetTable.Where(exp).AsQueryable(); }

}

其中日常現場命中附近可能有10000到15000,會與上述資料庫模式「查找全部」建議?

閱讀有關存儲庫模式,也是事實最後幾天之後,有在專家本人之間的意見差異,我越來越糊塗如何倉庫可以被有效地使用,(http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx

我知道的問題是模糊的,但任何建議表示讚賞。

編輯* 1

我喜歡這點約DAL: 試圖封裝使事情更容易,偉大的工作。嘗試封裝,以便您可以切換OR/Ms?將無法工作,將是昂貴和痛苦。

編輯* 2

我越來越傾向於「CQRS」模式。這看起來是合乎邏輯的,而且從我讀過的內容來看,讀取速度會更快,即使陳舊。 根據域對象從域讀取將導致不必要的處理,以填充AggregateRoot,然後將它們轉換爲ViewModels。

謝謝 的三月

回答

1

對於NHibernate的,簡單地返回IQuerable是NHibernate的LINQ將你的表達後,爲您創建的,如果需要的話。

你不想做的事情是讓nHibernate將所有的東西都轉換爲列表或其他對象,然後在其上使用AsQueryable。簡單地說:

return Session.Linq<T>.Where(Exp); 

這可能不是你最初想什麼,但這樣做,你讓LINQ的功率工作,你用的IQueryable做什麼,一路過關斬將,以數據庫進行復制。例如,如果方法的調用者只是想要聚合,則聚合可能發生在數據庫服務器上,並且效率更高,而不是檢索所有記錄,然後在本地執行聚合。

記住 - 使用IQueryable,你只是建立一個表達式樹,直到你到達樹實際需要被執行的點。當發生這種情況時,使用LINQ提供的LINQ提供者到nHibernate,解析表達式樹中的任何內容,併爲數據庫形成查詢。性能提升,因爲只有你需要的是從數據庫退出 - 不多或少。

因爲它發生在數據庫上,所以你描述的模式應該工作得很好。您不會每次都檢索所有實體,只需要那些實體。

一如既往,這可能不適合您的情況。

+0

它確實幫了我。我正在更多地研究IQueryable來了解它的執行情況。你會建議傳遞一個自定義的QueryObject,然後根據它創建表達式或直接將表達式傳遞給存儲庫。 – TheMar 2010-09-22 20:51:00