假设我有一个应用程序,让用户创建要应用于域实体的业务规则。规则可以是条件和多个操作的组合,如果条件评估为真,则执行相应的操作。此规则由用户以自由格式的文本格式创建,然后将其转换为规则引擎可以理解和执行的专有格式。
例如,对于员工管理系统,如果有业务规则来检查员工是否在当前角色工作超过一年并且表现好于预期,则可以晋升为下一个角色,加薪 10%。此业务规则可由用户输入,如下所示。
条件:Employee.CurrentRoleLength > 1 && Employee.ExceededExpectations()
操作:Employee.PromoteToNextRole() | Employee.GiveSalaryIncrement(10)
请注意,多个操作用|分隔。. 同样为了执行这个规则,应用程序使用一个单独的规则引擎类库来解析这个条件和两个动作到一个专有的格式,比如说,ExecutableScript也在规则引擎类库中定义。
现在为了使用 DDD 对这个需求进行建模;我想出了以下域对象。
规则(实体)
条件(值对象)
操作(值对象)
其中 Rule 是一个实体,它包含一个条件值对象和一个操作值对象列表,如下所示。
public class Rule : Entity
{
public Condition Condition { get; private set; }
public IList<Action> Actions { get; private set;}
public Rule(Condition condition, IList<Action> actions)
{
Condition = condition;
Actions = actions;
}
}
public sealed class Condition : ValueObject<Condition>
{
public string ConditionText { get; private set;}
public ExecutableScript ExecutableCondition{ get; private set;}
public Condition(string conditionText)
{
ConditionText = conditionText;
}
public Parse()
{
ExecutableCondition = // How to parse using external rule engine ??;
}
public Execute()
{
// How to execute using external rule engine ??;
}
}
public sealed class Action : ValueObject<Action>
{
public string ActionText{ get; private set;}
public ExecutableScript ExecutableAction{ get; private set;}
public Action(string actionText)
{
ActionText = actionText;
}
public Parse()
{
ExecutableAction = // How to parse using external rule engine ??;
}
public Execute()
{
// How to execute using external rule engine ??;
}
}
基于上述领域模型,我有以下问题。
如何在不依赖外部规则引擎的情况下解析和执行条件和操作。我理解域层不应该对外层有任何依赖,应该局限于它自己的。
即使我在它们的域对象之外解析条件和操作,它们解析的 ExceutableScript 值仍然需要存在于它们中,这仍然需要依赖于外部规则引擎。
是否只是 DDD 不是这种情况的正确方法,我走错了方向。
对不起,很长的帖子。任何帮助将不胜感激。
谢谢。