2010-09-02 24 views
0

假設我有一個服務StateService它有一個方法ChangeState如何以及何時應用業務規則?

ChangeState(State toState, DomainObject object) 

我有一個檢查目標狀態是否有效或無效的域對象當前的「狀態」,我怎麼能在技術上檢查這些規則,而不先設置使用toState域對象的業務規則?首先設置新狀態,運行驗證並且如果一個或多個規則中斷取消設置狀態,則感覺錯誤。

我想出的一個解決方案是創建一些驅動驗證的上下文對象,例如。 ChangeStateContext包含DomainObject以及要設置的狀態。

另一個相關的問題是如何從ChageState調用回報它是如何去的?
我可以收集所有違規的驗證規則,並拋出一個異常與調用者可以捕獲並相應處理的規則,或者我可以在ChangeState方法上添加返回類型,如ValidationSummary,其中包含關於違反規則等的信息。這些情況下的最佳做法是什麼?

回答

0

當狀態轉換無效時,您不能從ChangeState方法拋出異常嗎?您可以拋出特定的例外,例如StateTransformationExceptionValidationException,您可以在調用堆棧中獲得更高的收益。您可以選擇包含這些異常類型的額外屬性,以便您可以非常精確地傳達出錯的用戶。

當您想在單個用戶操作後調用多個ChangeStates時,您將需要一種方法來恢復或回滾。我通常所做的是使用工作單元模式(由LINQ to SQL和實體框架提供給我)並更改此工作單元中的所有狀態。當拋出異常時,我會拋棄整個工作單元及其所有更改。

0

DomainObject類可以有一個public bool CanChangeState(State toState)實例方法,返回True如果toState是從主體DomainObject的當前狀態的有效轉變。這種方法可以在調用StateService.ChangeState之前調用。

當然,如果StateService負責狀態更改驗證,則應將CanChangeState(State toState, DomainObject obj)方法添加到StateService

要報告驗證錯誤消息,請將CanChangeState的返回類型更改爲負責報告驗證錯誤的自定義類型。