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

C# 使用业务规则规范模式重构代码,c#,refactoring,cqrs,specifications,C#,Refactoring,Cqrs,Specifications,我想使用Specification模式在我的N-layerdddd应用程序中应用业务规则。 我在应用层中也使用了CQRS模式。 因此,我在我的域中定义了以下接口: public interface ISpecification<T> { Expression<Func<T, bool>> Predicate { get; } bool IsSatisfiedBy(T entity); } 我认为OrderProcessCommandHandl

我想使用
Specification
模式在我的
N-layerdddd
应用程序中应用业务规则。 我在
应用层中也使用了
CQRS
模式。 因此,我在我的
中定义了以下
接口

public interface ISpecification<T>
{
    Expression<Func<T, bool>> Predicate { get; }
    bool IsSatisfiedBy(T entity);
}
我认为
OrderProcessCommandHandler
Handle()
方法违反了

  • Tell-not-ask
    原则,因为他问
    BR
    满足感源于
    Order
    ,然后决定做一些事情

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

    我如何重构代码以防止这种违规行为


    • 我不会说它违反了这一原则

    • 原则。

      您的代码遵循这个原则,因为您告诉
      Handle()
      ,并且您的“逻辑”和“数据”放在一个方法中

      如果您的
      执行某些操作
      逻辑告诉
      speciallorderspecification
      ,则可能会违反此规则

    • 打开/关闭原则

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

      如果添加另一个规范需要更改
      ICommandHandler
      接口,则可能会违反该规范


    • 为了遵循依赖倒置原则,我建议您通过构造函数注入所有规范(例如,
      bigordspecification
      speciallorderspecification
      )。而且,如果您注入依赖项(即规范),您可以在处理程序之外编写规范,而规范编写的更改根本不会影响处理程序类。
      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.") 
          }      
      }