使用业务规则的规范模式重构代码
本文关键字:模式 重构 代码 范模式 业务 规则 | 更新日期: 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.")
}
}
我认为OrderProcessCommandHandler
的Handle()
方法违反了
Tell don't ask
原则,因为他要求Order
满足BR
的结果,然后决定做某事。Open/Close
原则,因为如果我想添加另一个规范,我必须更改我的CommandHandler
。我如何重构我的代码来防止这种违反?
我不会说它违反了这些原则
-
告诉不要问原则。
你的代码遵循这个原则,因为你告诉
Handle()
,你的"逻辑"answers"数据"放在一个方法中。如果你的
do some things
逻辑告诉SpecialOrderSpecification
一些事情, -
打开/关闭原则
您的代码遵循这一原则,因为如果您想添加另一个规范,您不应该更改
ICommandHandler<T>
接口。如果增加另一个规范需要更改
ICommandHandler<T>
接口,则会违反
为了遵循依赖倒置原则我建议您通过构造函数注入所有规范(例如BigOrderSpecification
, SpecialOrderSpecification
)。