Deklarative RuleSets
Neben der Verwendung des Regel-Editors zum Erstellen markupbasierter Regelsätze können Regeln programmgesteuert mithilfe der RuleDefinitions-Klasse erstellt werden. Diese Klasse verfügt über zwei Auflistungseigenschaften mit der Bezeichnung Conditions und RuleSets.
Im folgenden Beispiel wird veranschaulicht, wie ein RuleSet programmgesteuert erstellt wird. In diesem Beispiel wird ein RuleSet-Objekt zuerst erstellt, bevor ihm Regeln hinzugefügt werden. Anschließend werden Referenzausdrücke erstellt. Damit werden die Regeln mit Instanzendaten verbunden, die in der Klasse vorhanden sind, mit der die BuildRuleSet-Methode implementiert wird. Der Rabatt (discount), orderValue und customerType-Verweise sind innerhalb der Klasse definierte Felder. Der nächste Schritt besteht darin, die Rabattregel für Privatkunden mit Objekten aus dem System.CodeDom-Namespace zu erstellen. Die erstellte Regel überprüft, ob der Auftragswert größer als 500 ist und ob es sich um einen Kunden vom Typ Privatkunde (residential) handelt. Trifft die Bedingung zu, beträgt der anzuwendende Rabatt 5 %. Dann wird eine ähnliche Regel mit anderen Werten erstellt, um einen Rabatt zu erstellen, der für Kunden vom Typ Geschäftskunde (business customer) angewendet wird. Beide Regeln werden dem ursprünglichen RuleSet hinzugefügt.
private RuleSet BuildRuleSet()
{
RuleSet discountRuleSet = new RuleSet("DiscountRuleSet");
// Define property and activity reference expressions.
CodeThisReferenceExpression thisRef = new CodeThisReferenceExpression();
CodeFieldReferenceExpression discountRef = new CodeFieldReferenceExpression(thisRef, "discount");
CodeFieldReferenceExpression orderValueRef = new CodeFieldReferenceExpression(thisRef, "orderValue");
CodeFieldReferenceExpression customerTypeRef = new CodeFieldReferenceExpression(thisRef, "customerType");
CodeTypeReferenceExpression customerEnumRef = new CodeTypeReferenceExpression(typeof(CustomerType));
// Add the residential discount rule.
// IF OrderValue > 500 AND CustomerType = Residential
// THEN Discount = 5%
Rule resDiscountRule = new Rule("ResidentialDiscountRule");
discountRuleSet.Rules.Add(resDiscountRule);
// Define the first predicate test: OrderValue > 500.
CodeBinaryOperatorExpression resOrderValueTest = new CodeBinaryOperatorExpression();
resOrderValueTest.Left = orderValueRef;
resOrderValueTest.Operator = CodeBinaryOperatorType.GreaterThan;
resOrderValueTest.Right = new CodePrimitiveExpression(500);
// Define the second predicate test: CustomerType = Residential.
CodeBinaryOperatorExpression resCustomerTypeTest = new CodeBinaryOperatorExpression();
resCustomerTypeTest.Left = customerTypeRef;
resCustomerTypeTest.Operator = CodeBinaryOperatorType.ValueEquality;
resCustomerTypeTest.Right = new CodeFieldReferenceExpression(customerEnumRef, "Residential");
// Join the two predicates into a single condition.
CodeBinaryOperatorExpression resCondition = new CodeBinaryOperatorExpression();
resCondition.Left = resOrderValueTest;
resCondition.Operator = CodeBinaryOperatorType.BooleanAnd;
resCondition.Right = resCustomerTypeTest;
resDiscountRule.Condition = new RuleExpressionCondition(resCondition);
// Add the rule action: Discount = 5%.
CodeAssignStatement resDiscountAction = new CodeAssignStatement(discountRef, new CodePrimitiveExpression(5));
resDiscountRule.ThenActions.Add(new RuleStatementAction(resDiscountAction));
// Add the business discount rule.
// IF OrderValue > 10000 AND CustomerType = Business
// THEN Discount = 10%
Rule busDiscountRule = new Rule("BusinessDiscountRule");
discountRuleSet.Rules.Add(busDiscountRule);
CodeBinaryOperatorExpression busOrderValueTest = new CodeBinaryOperatorExpression();
busOrderValueTest.Left = orderValueRef;
busOrderValueTest.Operator = CodeBinaryOperatorType.GreaterThan;
busOrderValueTest.Right = new CodePrimitiveExpression(10000);
CodeBinaryOperatorExpression busCustomerTypeTest = new CodeBinaryOperatorExpression();
busCustomerTypeTest.Left = customerTypeRef;
busCustomerTypeTest.Operator = CodeBinaryOperatorType.ValueEquality;
busCustomerTypeTest.Right = new CodeFieldReferenceExpression(customerEnumRef, "Business");
CodeBinaryOperatorExpression busCondition = new CodeBinaryOperatorExpression();
busCondition.Left = busOrderValueTest;
busCondition.Operator = CodeBinaryOperatorType.BooleanAnd;
busCondition.Right = busCustomerTypeTest;
busDiscountRule.Condition = new RuleExpressionCondition(busCondition);
CodeAssignStatement busDiscountAction = new CodeAssignStatement(discountRef, new CodePrimitiveExpression(10));
busDiscountRule.ThenActions.Add(new RuleStatementAction(busDiscountAction));
return discountRuleSet;
}
Soll ein RuleDefinitions-Objekt erstellt und einem Workflow zugewiesen werden, fügen Sie den zuvor angezeigten RuleSet folgendermaßen hinzu:
RuleDefinitions definitions = new RuleDefinitions();
definitions.RuleSets.Add(BuildRuleSet());
this.SetValue(RuleDefinitions.RuleDefinitionsProperty, definitions);
Soll RuleSet mit einer PolicyActivity-Aktivität verwendet werden, erstellen Sie mit dem Namen des RuleSet folgendermaßen einen neuen RuleSetReference als Konstruktorparameter:
private void InitializeComponent()
{
this.CanModifyActivities = true;
// Create the Policy activity.
this.discountPolicy = new PolicyActivity();
this.discountPolicy.Name = "advancedDiscountPolicy";
this.discountPolicy.RuleSetReference = new RuleSetReference("DiscountRuleSet");
// Define the workflow.
this.Activities.Add(this.discountPolicy);
this.Name = "DiscountPolicyWorkflow";
this.CanModifyActivities = false;
}
private PolicyActivity discountPolicy;
Eine ähnliche Methode wird zum Verwenden von Regeln als Aktivitätsbedingungen verwendet:
// This code is called by the workflow constructor.
CodeBinaryOperatorExpression check =
new CodeBinaryOperatorExpression();
check.Left = new CodeFieldReferenceExpression(
new CodeThisReferenceExpression(), "orderValue");
check.Operator = CodeBinaryOperatorType.LessThan;
check.Right = new CodePrimitiveExpression(10000);
RuleDefinitions definitions = new RuleDefinitions();
definitions.Conditions.Add(
new RuleExpressionCondition("Condition1", check));
this.SetValue(RuleDefinitions.RuleDefinitionsProperty, definitions);
// This code is called in the InitializeComponent method to populate the
// condition on an IfElseBranch activity.
RuleConditionReference condition1 = new RuleConditionReference();
condition1.ConditionName = "Condition1";
ifElseBranch1.Condition = condition1;
Siehe auch
Referenz
Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.