我想使用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
。
我如何重构代码以防止此类违规?
答案 0 :(得分:2)
我不会说它违反了原则
您的代码遵循这一原则,因为您告诉Handle()
和您的&#34;逻辑&#34;和&#34;数据&#34;放在一个方法中。
如果do some things
逻辑告诉SpecialOrderSpecification
,可能会违反。
打开/关闭原则
您的代码遵循此原则,因为如果要添加另一个规范,则不应更改ICommandHandler<T>
接口。
如果添加另一个规范需要更改ICommandHandler<T>
界面,则可能违反。
为了遵循依赖性倒置原则,我建议您通过构造函数注入所有规范(例如BigOrderSpecification
,SpecialOrderSpecification
)。