考慮:
- 您有層表示,業務和數據的架構。
- 您正在應用領域驅動設計。
- 您正在使用一種對象關係映射器,它允許您創建面向對象的查詢(例如,可讓您創建HQL查詢的NHibernate)。
問:
向一個層,你應該把面向對象的查詢?何處將分層體系結構中的面向對象的查詢?
我的想法:
我想將它們放入表示層通常是沒有意義的。但我不知道是否將它們放入業務或數據層。
例(NHibernate的):
說你的業務邏輯需要一些方法GetCustomersPossiblyInterestedIn(產品P)。然後,您可以創建一個複雜的HQL查詢來選擇客戶對象,其中客戶已經購買了與p相同類別的產品。
變元)
,一方面,我會說這查詢顯然是業務邏輯,因爲客戶是基於她是否買一個產品一個產品可能感興趣的處理決定同一類別是一個商業決策。您也可以選擇以相似價格購買同一類別中的多個產品的客戶,例如
參數b)中
在另一方面,業務層不應當取決於數據層,所以直接使用NHibernate在業務層環的警鈴。
可能的解決方法1)
創建您在業務層數據層使用,並轉換爲HQL自己的面向對象的查詢語言。 我認爲這會造成很多開銷。如果您使用基於查詢對象而不是解析查詢語言的查詢語言,那麼您可能會付出一些努力,但我的反對意見仍然適用。
可能的解決方法2)
在業務層直接使用NHibernate是O.K.,因爲抽象級別NHibernate的是能夠與HQL,ISession的等提供適合的業務層。沒有必要包裝它。
你覺得呢?
編輯:
爲密切相關的討論參見"Repository is the new Singleton"和"The false myth of encapsulating data access in the DAL"由Ayende Rahien。
您是否將規範模式視爲解決方案3? – Paco 2010-09-23 15:24:38
到目前爲止,沒有。但是,謝謝,我會看看它。 – 2010-09-26 20:13:44