假设我有一个服务 StateService ,它有一个方法 ChangeState 。
ChangeState(State toState, DomainObject object)
我有业务规则检查目标状态在域对象当前“状态”中是否有效,如何在没有首先在域对象上设置toState的情况下从技术上检查这些规则?首先设置新状态,运行验证以及一个或多个规则中断取消设置状态会感觉不对。
我想出的一个解决方案是创建一些驱动验证的上下文对象,例如。 包含DomainObject的 ChangeStateContext 以及要设置的State。
另一个相关问题是如何从ChageState调用回报它是怎么回事? 我可以收集所有破坏的验证规则,并使用调用者可以捕获和处理的规则抛出异常,或者我可以在ChangeState方法上添加返回类型,如 ValidationSummary ,其中包含有关已损坏规则的信息等等。在这些情况下,最佳做法是什么?
答案 0 :(得分:0)
当状态转换无效时,你不能从ChangeState
方法抛出异常吗?您可以抛出特定的异常,例如StateTransformationException
或ValidationException
,您可以在调用堆栈中捕获更高的异常。您可以选择为这些异常类型添加额外的属性,以便您可以非常准确地与用户进行错误沟通。
如果要在单个用户操作后调用多个ChangeStates,则需要一种方法来还原或回滚。我通常做的是使用工作单元模式(由LINQ to SQL和Entity Framework提供给我)并更改此工作单元中的所有状态。当抛出异常时,我会抛弃整个工作单元及其所有更改。
答案 1 :(得分:0)
DomainObject
类可以有public bool CanChangeState(State toState)
实例方法,如果True
是来自主题toState
的当前状态的有效转换,则返回DomainObject
。可以在StateService.ChangeState
调用之前调用此方法。
当然,如果StateService
负责状态更改验证,则应将CanChangeState(State toState, DomainObject obj)
方法添加到StateService
。
要报告验证错误消息,请将CanChangeState
的返回类型更改为负责报告验证错误的自定义类型。