好的quiestions。幾天前我也在想他們。實際上,試用NHibernate 3.0 alpha(或者當前的中繼),它的新的LINQ提供程序比以前的要多得多。 (到目前爲止,我只發現了一種方法不起作用,但如果遇到默認情況下不支持的東西,就可以掛鉤自己的機制。) 我沒有問題(還沒有?)使用當前樹幹。您可以在http://www.hornget.net/packages/網站上找到「夜間」版本,以及針對它的FluentNHibernate版本。如果您知道如何使用它,Fluent會真正提高您的工作效率。 SO社區really helped me with that也是如此。
如果您的業務層對NHibernate有直接依賴關係,或者您正在編寫的小型應用程序在沒有這種抽象的情況下仍然可以維護,那麼您最好不要使用存儲庫模式。但是,如果你做得對,它可以爲你節省大量的冗餘編碼。
抽象它的原因不僅有用,因爲之後您可以用另一個ORM替換NHibernate,但由於存在一個名爲Separation of Concerns的概念,所以這是一個很好的做法。您的業務邏輯層不應該關心或瞭解如何訪問它所處理的數據。這使得維護應用程序或其不同層次變得更容易,這也使得團隊協作更容易:如果X創建數據訪問層,並且Y寫入業務邏輯,則他們不必詳細瞭解彼此的工作。
揭示IQueryable<T>
是一個非常好的主意,這正是許多存儲庫實現正在做的事情。 (我也是,儘管我更喜歡將它寫入靜態類。) 當然,如果需要,您必須公開一些插入或更新實體的方法,或者用於開始和提交事務的方法。 (BeginTransaction應該只是返回一個IDisposable
以避免泄露NHibernate接口,這樣可以。)
我可以給你一些指導:查看SharpArchitecture或FubuMVC Contrib的實現,以獲得關於如何做的一些想法它是正確的,這是how I solved it。
如何用linq添加一個新項目到數據庫? – Paco 2010-05-01 15:15:11
@Paco:向數據庫添加一個新項目很容易抽象,我不是在談論這個。查詢是實際的問題,因爲沒有簡單的方法來通過存儲庫啓用複雜查詢而沒有足夠的編碼。 – Groo 2010-05-01 17:02:17