【问题标题】:How and when to apply business rules?如何以及何时应用业务规则?
【发布时间】:2010-09-02 20:07:57
【问题描述】:

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

ChangeState(State toState, DomainObject object)

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

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

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

【问题讨论】:

    标签: validation business-rules


    【解决方案1】:

    不能在状态转换无效的情况下从ChangeState方法抛出异常吗?您可以抛出特定异常,例如StateTransformationExceptionValidationException,您可以在调用堆栈上捕获更高的位置。您可以选择在这些异常类型中包含额外的属性,以便您可以非常准确地向用户传达问题所在。

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

    【讨论】:

      【解决方案2】:

      DomainObject 类可以有一个public bool CanChangeState(State toState) 实例方法,如果toState 是从主题DomainObject 的当前状态的有效转换,则返回True。此类方法可以在StateService.ChangeState 调用之前调用。

      当然,如果StateService负责状态变化验证,那么CanChangeState(State toState, DomainObject obj)方法应该添加到StateService中。

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

      【讨论】:

        猜你喜欢
        • 2013-10-25
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多