如何以及何时应用业务规则?

时间:2010-09-02 20:07:57

标签: validation business-rules

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

ChangeState(State toState, DomainObject object)

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

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

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

2 个答案:

答案 0 :(得分:0)

当状态转换无效时,你不能从ChangeState方法抛出异常吗?您可以抛出特定的异常,例如StateTransformationExceptionValidationException,您可以在调用堆栈中捕获更高的异常。您可以选择为这些异常类型添加额外的属性,以便您可以非常准确地与用户进行错误沟通。

如果要在单个用户操作后调用多个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的返回类型更改为负责报告验证错误的自定义类型。