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

本文关键字:模式 重构 代码 范模式 业务 规则 | 更新日期: 2023-09-27 18:01:48

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

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.") 
    }      
}

我认为OrderProcessCommandHandlerHandle()方法违反了

  • Tell don't ask原则,因为他要求Order满足BR的结果,然后决定做某事。

  • Open/Close原则,因为如果我想添加另一个规范,我必须更改我的CommandHandler

    我如何重构我的代码来防止这种违反?

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

我不会说它违反了这些原则

  1. 告诉不要问原则。

    你的代码遵循这个原则,因为你告诉Handle(),你的"逻辑"answers"数据"放在一个方法中。

    如果你的do some things逻辑告诉SpecialOrderSpecification一些事情,

  2. 打开/关闭原则

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

    如果增加另一个规范需要更改ICommandHandler<T>接口,则会违反

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