2011-01-14 22 views
8

我最近開始調查我即將開始的綠色野外項目的CQRS和DDD。我研究了Udi Dahan,Greg Young,Mark Nijhof等人提供的大量材料。這些非常有幫助,我認爲我對這些概念有很好的理解。但是,我仍然在想如何將這些應用於我自己的領域。CQRS - 如何建立場景執行系統的模型

我的系統基本上是一個複雜的規則引擎 - 規則將決定某些產品的最終價格。產品定義和規則將由管理員輸入到系統中。規則將由管理員使用預定義的一組屬性來設計,這些屬性可以具有預定義集合中的值,例如'購買目的'(轉售,出租)或自由格式值,如年齡

每個產品都有一個基準價格,如果適用,規則基本上會從基準價格中增加/刪除。

一個非常簡單的示例規則可能是:

對於產品X,IF(購買目的=經銷和年齡> 25)加$ 25到基準價。

所以有兩種用戶使用系統,管理員,誰定義產品,規則和基價;以及基於他們通過假設用戶界面輸入的場景查詢定價的其他用戶。

我的困惑在於:運行場景根本不會改變域的狀態,沒有其他外部系統/人員對場景執行的結果感興趣,但是正在運行的用戶本人 - 它返回在運行給定方案的適用規則後進行價格計算的結果。例如,用戶可以選擇產品X並查詢給定業務情景的定價,如(採購目的=轉售和年齡= 40)。再一次,因爲這個操作根本不會改變域的狀態,所以我猜這是一個查詢。但是,在場景中有一個規則引擎用於計算最終價格,我猜可以將其劃分爲正在運行的域邏輯。那麼 - 這個邏輯屬於哪裏?這是一個只讀模型的查詢,還是運行一個需要在域模型中運行的命令的場景?同樣,感覺像域層是這些規則的地方,但是如何將場景執行的結果傳遞給用戶(就像查詢以這種方式思考的那樣)。或者,也許CQRS不是解決這個問題的正確方案?

+0

+1告訴我,有一個[cqrs](http://blog.fossmo.net/post/Command-and-Query-Responsibility-Segregation-%28CQRS%29.aspx)模式,我從來沒有聽說過之前。 – k3b 2011-01-15 14:49:47

回答

4

我在我自己的領域(電子調度4醫療保健)有這個確切的問題。基本上,系統是使用域模型(寫入端)配置的。這將是在您的域中定義規則,產品和基準價格。什麼來自域名?事件,狀態變化,發生的原因以及發生的原因。現在我所做的是在不同的有界上下文中使用這些事件,在我的情況下是一個複雜的搜索引擎,可以在醫生,手術室和昂貴設備的時間表中找到空閒插槽。這可能是一條您可能採用的路線,消耗您的產品,基本價格和規則相關事件,並以這樣一種方式存儲它們,即位於該數據之上的規則引擎可以像處理用戶對場景的請求一樣高效地處理可能。您很可能會發現存儲更改的模型(域)與優化後的模型不同,以查詢這些假設情景(規則引擎)。您的域名可能會有類似「您無法指定同一產品兩次」或「此規則永遠不會匹配(年齡 &年齡> 25)」的規則。該域只關心允許有效的狀態更改。這不是規則引擎的關注點。你會很想重用規則引擎中在域中定義的概念/類。抵制那種衝動。質疑他們是否真的服務於同一目的。爲不同目的建模兩次並不髒或違反DRY。

+0

爲了澄清,使用基於查詢處理程序的方法沒有任何問題,其中查詢被建模爲對象/消息(非常像命令和事件),處理程序處理該查詢請求併發出查詢響應。這可能是您的規則引擎的前端。 – 2011-01-15 13:04:27

0

CQRS沒有說明在應用程序的查詢部分中不應該有域邏輯。如果可行且實用,那麼可以爲每個方面或者甚至是應用程序的查詢分別設置非規範化的查詢存儲,但這當然不是必需的。

簡而言之,查詢是一個查詢,無論查找它的任務有多複雜。