0

假设我有一个服务StateService,它有一个方法ChangeState

ChangeState(State toState, DomainObject object)

我有业务规则来检查目标状态在域对象当前“状态”中是否有效,我如何在不首先在域对象上设置 toState 的情况下从技术上检查这些规则?首先设置新状态,运行验证,如果一个或多个规则破坏取消设置状态,感觉是错误的

我想出的一种解决方案是创建一些驱动验证的上下文对象,例如。 ChangeStateContext包含 DomainObject 以及要设置的状态。

另一个相关问题是如何从 ChageState 电话中报告进展情况?
我可以收集所有破坏并抛出异常的验证规则,调用者可以相应地捕获和处理这些规则,或者我可以在 ChangeState 方法上添加返回类型,例如ValidationSummary,其中包含有关破坏规则等的信息。在这些情况下,最佳做法是什么?

4

2 回答 2

0

ChangeState当状态转换无效时,不能从方法中抛出异常吗?您可以抛出特定异常,例如StateTransformationException可以ValidationException在调用堆栈上捕获更高级别的异常。您可以选择在这些异常类型中包含额外的属性,以便您可以非常准确地向用户传达出了什么问题。

当您想在单个用户操作后调用多个 ChangeStates 时,您将需要一种恢复或回滚的方法。我通常做的是使用工作单元模式(由 LINQ to SQL 和实体框架提供给我)并更改此工作单元内的所有状态。当抛出异常时,我会丢弃整个工作单元及其所有更改。

于 2010-09-03T10:00:55.487 回答
0

该类DomainObject可以有一个public bool CanChangeState(State toState)实例方法,返回TrueiftoState是从 subject 的当前状态的有效转换DomainObject。这样的方法可以在调用之前StateService.ChangeState调用。

当然,如果StateService负责状态更改验证,那么CanChangeState(State toState, DomainObject obj)应该在StateService.

要报告验证错误消息,请将返回类型更改为CanChangeState负责报告验证错误的自定义类型。

于 2011-03-02T15:59:36.833 回答