使用业务规则的规范模式重构代码

时间:2014-05-06 09:28:25

标签: c# refactoring cqrs specifications

我想使用Specification模式在我的N-Layerd DDD应用程序中应用业务规则。 我在CQRS也使用了Application Layer模式。 所以我在Interface中定义了Domain

public interface ISpecification<T>
{
    Expression<Func<T, bool>> Predicate { get; }
    bool IsSatisfiedBy(T entity);
}

以及实现上述界面的一些Specification,例如BigOrderSpecification : ISpecification<Order>SpecialOrderSpecification:ISpecification<Order>

我使用以下处理程序来处理我的订单:

public class OrderProcessCommandHandler : ICommandHandler<Order>
{
    OrderCommand _command;
    public OrderProcessCommandHandler(OrderCommand command) 
    {
       _command = command;
    }
    public Handle()
    {
        var bigOrderSpec = new BigOrderSpecification();
        var specialOrderSpec = new SpecialOrderSpecification();
        var spec = bigOrderSpec.And(specialOrderSpec);
        if (spec.IsSatisfiedBy(_commnand.Order))
           // do some things
        else
            throw new BusinessException("Some business rules violated.") 
    }      
}

我认为Handle()的{​​{1}}方法违反了

  • OrderProcessCommandHandler原则,因为他Tell don't ask提出BR满意结果,然后决定做某事。
  • Order原则,因为如果我想添加其他规范,我必须更改Open/Close

    我如何重构代码以防止此类违规?

1 个答案:

答案 0 :(得分:2)

我不会说它违反了原则

  1. Tell don't ask原则。

    您的代码遵循这一原则,因为您告诉Handle()和您的&#34;逻辑&#34;和&#34;数据&#34;放在一个方法中。

    如果do some things逻辑告诉SpecialOrderSpecification,可能会违反。

  2. 打开/关闭原则

    您的代码遵循此原则,因为如果要添加另一个规范,则不应更改ICommandHandler<T>接口。

    如果添加另一个规范需要更改ICommandHandler<T>界面,则可能违反。

  3. 为了遵循依赖性倒置原则,我建议您通过构造函数注入所有规范(例如BigOrderSpecificationSpecialOrderSpecification)。