2012-06-01 37 views
1

在我的各種項目中,我實現了命令/查詢分離模式並使用NHibernate作爲我的ORM。使用ORM時的命令/查詢分隔

一般我把我的命令和查詢在不同的項目相關的組特定的活動,如UserManagementTagManagementQuestionManagement

我很喜歡具有容易瑪麗薩功能都劃分成精美的這些倉庫。這樣做的確有好處。

但是我開始懷疑這個抽象對於基本查詢的價值,特別是考慮到NHibernate已經提供瞭如此強大的抽象本身。

在我的MVC控制器考慮一下:

_nHibernateSession.Get<UserProfile>(_sessionData.UserId); 

我可以抽象了這一點到的UserManagement庫的查詢,但我不知道那是什麼,提供價值。

您認爲如何?你會保留在命令/查詢範例中的所有內容,還是直接在控制器中使用nhibernate會話來處理這樣的簡單請求?

回答

2

我寧願保持所有查詢在,如果你需要做出很多不同的查詢,你可以露出實現一個IQueryable的倉庫和包裹LINQ NHibernate的的session.Query,是有侷限性的尊重到HQL或標準。

但是對於我來說,沒有一個合理的理由來做到這一點,只有當你提供一個數據訪問層給別人,你不會知道這些查詢。

你可以在DDD上看到這個例子project我正在工作。

1

我強烈建議你保持你的MVC控制器和NHibernate之間的抽象級別,特別是當你需要對你的MVC控制器進行單元測試時。沒有存儲庫層,創建需要模擬存儲庫層的單元測試要困難得多。

3

通常我不使用存儲庫,因爲我認爲他們在我的代碼中添加了太多的抽象。我更喜歡直接在服務/控制器層構建的View Model。如果我想編寫一個單元測試,我可以將其寫入服務或控制器。如果你想重用一些查詢條件,然後只寫擴展方法:

​​

對此,我建議這些文章: http://ayende.com/blog/3955/repository-is-the-new-singleton http://www.planetgeek.ch/2012/05/05/what-is-that-all-about-the-repository-anti-pattern/