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