2012-11-23 76 views
0

我正在開發一組封裝我們的域的部分的程序集,這些程序集將由許多應用程序共享。使用訂單管理系統的例子,一個這樣的程序集將包含應用程序可以通過訂單執行的所有核心操作。我們正在應用簡單版本的CQS/CQRS,以便所有改變「系統」狀態的操作都被表示爲公共命令,例如CancelOrderCommand,ShipOrderCommand和CreateORderCommand。命令處理程序在程序集內部。如何從共享模塊中暴露讀取模型

我正在努力回答的問題是如何最好地將讀取模型暴露給消費代碼?

讀取模型將被消耗代碼用於執行查詢。我不知道如何使用讀取模型的所有方式,因此界面需要靈活以允許任何查詢。

對我來說,它的複雜性在於我不僅需要暴露我的聚合根,還有幾個客戶端應用程序可能使用的相關數據的「查找」列表。例如,每個訂單都有一個關聯的OrderType,它是數據驅動的(即不是枚舉),幷包含多個屬性,這些屬性將驅動我們的一些業務規則來控制哪些操作可以/不可以執行等。在我的內部很容易模塊來管理這種關係;但是,允許訂單創建的客戶端應用程序很可能需要向用戶顯示可能的OrderType列表。因此,我不僅需要公開訂單集合列表,還需要從我的閱讀模型中顯示OrderTypes(以及其他查找列表)的支持列表。

這通常是如何完成的?

我不知道還有什麼可以解釋,這將有助於觸發的解決方案,所以請你離開......

回答

0

我從來沒有見過一個基於CQRS實現暴露出一個完整的數據集的即席查詢所以這是一個有趣的情況!在典型的CQRS場景中,您將公開非常具體的查詢,因爲您可能想在調用它們時引發事件(例如,緩存) - 有關該問題的更多詳細信息,請參見this post)。但是由於這是您的設計,我們不必擔心「典型」或「正確」CQRS,我想您只需要一個解決方案!爲我提供的靈活查詢數據的最佳新機制之一是Open Data Protocol (OData)。它將允許消費者對您公開的數據源實施自己的過濾,排序和分頁。

這似乎大多數的實現處理關係數據。如果您正在處理關係數據源,那麼OData可能是一個不錯的選擇。我懷疑你的評論是「暴露我的聚合根」,你可能正在使用文檔數據庫?如果是這樣的話,我在MongoDB上看到了一個OData服務的例子:http://bloggingabout.net/blogs/vagif/archive/2012/10/11/mongodb-odata-provider-now-supports-arrays-and-nested-collections.aspx

我希望有幫助,OData絕對值得研究。它似乎在迅速增長,並且在服務器和客戶端技術平臺上獲得了良好的支持。