2016-09-29 73 views
0

比方說,我們有一個類Order(與用戶有關),它有財產state。我想在同一時間內防止有多個確認的訂單,因此在我確認任何訂單之前,我必須檢查是否已經在其時間段內確認了一些訂單。將存儲庫注入到域對象或存儲庫應該注意業務邏輯?

我可以讓2層的方法(我知道):

  1. OrderRepository有一個功能changeState哪個搜索改變之前,衝突的確認訂單,並允許它只有當什麼也沒發現 - 這裏的問題是庫知道改變狀態的邏輯。

  2. OrderRespository注入OrderOrder具有功能changeState將使用該庫以檢查衝突 - 這裏的問題是域對象瞭解持久性。

什麼是正確的方法?

+0

可能重複的[實體可以訪問存儲庫?](http://stackoverflow.com/questions/827670/is-it-ok-for-entities-to-access-repositories) – guillaume31

+0

不,已在那裏,據我所知,第二種方法很糟糕,我仍然不知道如何正確處理它。 – kuba

+0

然後你的Q標題並不反映你真正想要的東西 - 你應該改變它。 – guillaume31

回答

2

存儲庫不負責域不變量。總量是。如果沒有Aggregate有自己內部需要的信息來檢查不變量,請嘗試質疑您的總體設計,也許會想出一個新的。

您也可以使用域服務。作爲一個較弱的選項,您還可以將域不變量降級到簡單的用例前提條件,並通過應用程序服務/命令處理程序進行檢查。請注意,後兩種選擇不能提供強有力的保證,以致域實體始終處於與該規則相一致的狀態。

0

另一種考慮這種情況的方法是從存儲庫責任的角度出發。在一天結束時,一個存儲庫是一個抽象來表示如何處理一個對象集合,在你的情況下,訂單。

因此,保持一致性和正確狀態的規則是有意義的,以便將集合表示在存儲庫層。將存儲庫注入實體可能是一種代碼異味,某些東西沒有正確建模。我會選擇你的第一個版本,但也許你不需要關注你的狀態變化,只需將這些規則嵌入到save()方法中即可。如果沒有其他人同時確認,您可以將更改保存到訂單中。

+0

我並不完全同意這一點。存儲庫不是您希望查找業務規則的地方。 – guillaume31

+0

從純粹的角度來看,你可能是對的。但是,由於類似這樣的事情(檢查並保存),我陷入了太多的併發問題,無法保持原樣。除非系統是消息驅動的,否則在這種情況下我會更實際一些。 – hasumedic

+0

我不知道。即使作爲代碼的維護者,您也不會認爲'OrderRepository'是執行衝突訂單規則的地方。這違背了最不讓人驚訝的原則。這非常實用。 – guillaume31

相關問題