2016-08-29 75 views
3

我有點困惑在哪裏實現應用程序的查詢方面,ATM我有未來的架構:CQRS查詢端執行

Product.UI.Web.Admin (MVC) 
Product.Application 
-CommandHandlers (e.g OrdersCommandHandler) 
-Commands (e.g CreateOrder) 
Product.Domain 
-Model (Behavior-rich models/repository interfaces) 
Product.Infrastructure (Base interfaces/classes) 
Product.Persistence 
-ReadModel (EF Generated models) 
--Implementation (Repository implementations: FindByID/Save) 
  1. 我應該把查詢的命名空間中Product.Application,他們應該直接訪問數據庫從那裏? (UI < = Product.Application < =數據庫)
  2. 我應該創建新程序集Product.Queries和Product.UI.Web.Admin應該直接訪問它嗎? (UI < = Product.Queries)
  3. 我應該在Product.Application中添加Queries命名空間並創建新的Assembly Product.Reporting並讓Application程序集通過Queries命名空間使用Reporting assembly嗎? (UI < = Product.Application.Queries < = Product.Reporting)

三個解決方案返回DTO的到UI。

我正在考慮解決方案#3,因爲它會很容易在查詢中使用域服務建設成果,也將使用Product.Reporting作爲數據訪問可使用ADO.Net,實體實施框架或NHibernate。或者,也許我誤解了一些東西。

請指導我並幫助我清除它,謝謝。

UPDATE 我來到第四個變體。

  1. 創建Product.Infrastructure.Queries組裝,有我有數據庫(dbcotnext)& ReadModel(EF生成的模型& 通用查詢接口)命名空間。
  2. 新增的DataModel命名空間Product.Application,在那裏,我有DTO的返回UI
  3. 新增查詢命名空間Product.Application,在那裏,我實現通用查詢和使用的DbContext檢索數據,地圖的DTO和返回到用戶界面。
+0

什麼是Product.Persistence.ReadModel?它是保存讀取模型的數據庫代碼嗎? – tomliversidge

+0

如何在Product.Application.Queries中聲明查詢接口並在Product.Infrastructure.Queries中實現它們? – plalx

+0

Product.Persistence.ReadModel中的@tomliversidge是由EF生成的數據庫模型,在Implementation Repository中接收Domain Model將其映射到ReadModel並且EF保存它,忘記提及我在Domain Model中具有存儲庫接口。 – QuietNaN

回答

0

我正在考慮解決方案#3,因爲它會很容易使用域服務中查詢到構建結果,也將使用Product.Reporting數據訪問可以實現使用ADO.Net,實體框架或NHibernate的。或者,也許我誤解了一些東西。

是的我也認爲你誤解了一些東西。

首先我們來談談什麼是域服務?: 當你有一個涉及多個實體的域概念,但你不確定哪個實體「擁有」了這個行爲。它似乎不屬於它們中的任何一個。這種思維模式是強烈需要域服務的指示器。 因此,當您使用cqrs時,域服務位於命令端,因此查詢端無法訪問域服務,實際上並不需要域服務,因爲查詢端不執行任何業務邏輯。你應該記得Command端和Query端是完全獨立的。

CQRS的另一個重要特性是,ReadModel可以使用像ADO.Net或微型ORM這樣的低級數據訪問技術,並通過沮喪的表格進行查詢以生成報告。所有這些想法都是出於性能考慮。此外,系統在將來你甚至可以在兩個單獨的實例上啓動命令和查詢方面。