我的软件需要有某种规则库。无论如何我可以序列化一条规则吗?
为什么单一规则?因为在实际的规则引擎执行之前,我希望能够将一些特定规则添加到我的RuleSet中,并通过windows workflow rule engine执行该RuleSet。
根据这里给出的例子,我知道我可以序列化一个RuleSet吗?
以下是其完成情况的简要说明:
this.Discount
CodePropertyReferenceExpression discountProperty =
new CodePropertyReferenceExpression(
new CodeThisReferenceExpression(),
"Discount");
CodePropertyReferenceExpression orderValueProperty =
new CodePropertyReferenceExpression(
new CodeThisReferenceExpression(),
"OrderValue");
// if this.OrderValue > 500
RuleCondition discountCondition = new RuleExpressionCondition(
new CodeBinaryOperatorExpression(
orderValueProperty,
CodeBinaryOperatorType.GreaterThan,
new CodePrimitiveExpression(500)));
// Create an action that sets the property Discount to 5%
RuleStatementAction setDiscountAction = new RuleStatementAction(
new CodeAssignStatement(discountProperty,
new CodePrimitiveExpression(5)));
Rule discountRule = new Rule("CalculateDiscount");
discountRule.Condition = discountCondition;
discountRule.ThenActions.Add(setDiscountAction);
ruleSet = new RuleSet("DiscountRuleSet");
ruleSet.Rules.Add(discountRule);
RuleDefinitions ruleDefinitions = new RuleDefinitions();
ruleDefinitions.RuleSets.Add(ruleSet);
WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer();
XmlTextWriter writer = new XmlTextWriter("MyRules.rules", System.Text.Encoding.Unicode);
serializer.Serialize(writer, ruleDefinitions);
writer.Close();
RuleEngine engine = new RuleEngine(ruleSet, typeof(Shopping));
// execute the rule on a shopping object where OrderValue = 100
// expect rule action to be not fired
Shopping shoppingUnder500 = new Shopping(100);
engine.Execute(shoppingUnder500);
Console.WriteLine("shoppingUnder500 - Discount evaluated: " + shoppingUnder500.Discount);
您可以在开头提到的链接中获得完整的示例。第6篇介绍了如何持久保存规则集。但是我想知道我们是否可以序列化一个规则,这只是一个编码条件表达式&一组陈述(动作)(再次由codedom表示)。
或者在某个地方存储单个规则的更好方法是什么?