Partager via


RuleSets déclaratifs

Outre l'utilisation de l'éditeur de règles pour créer des rulesets de balise, les règles peuvent être créées par programme à l'aide de la classe RuleDefinitions. Cette classe comprend deux propriétés de collection nommées Conditions et RuleSets.

L'exemple suivant montre comment créer par programme une classe RuleSet. Dans cet exemple, un objet RuleSet est d'abord créé avant de lui ajouter des règles. Les expressions de référence sont ensuite créées pour relier les règles aux données d'instance présentes dans la classe qui implémente la méthode BuildRuleSet. Les références de remise, orderValue et customerType sont des champs définis dans la classe. L'étape suivante consiste à créer la règle de remise résidentielle à l'aide d'objets issus de l'espace de noms System.CodeDom. La règle créée vérifie si la valeur d'ordre est supérieure à 500 et si le type de client est résidentiel. Si la condition est remplie, la remise appliquée est de 5 %. Une règle similaire est ensuite créée à l'aide de valeurs différentes pour indiquer l'application d'une remise si le type du client correspond à une entreprise. Ces deux règles sont ajoutées à la classe RuleSet initiale.

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;
}

Pour créer un objet RuleDefinitions et l'associer à un workflow, ajoutez le RuleSet montré précédemment comme suit :

RuleDefinitions definitions = new RuleDefinitions();
definitions.RuleSets.Add(BuildRuleSet());
this.SetValue(RuleDefinitions.RuleDefinitionsProperty, definitions);

Pour utiliser le RuleSet avec une activité PolicyActivity, créez une classe RuleSetReference utilisant le nom du RuleSet comme paramètre de constructeur comme suit :

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;

Une méthode similaire permet d'utiliser des règles comme conditions d'activité :

// 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;

Voir aussi

Référence

RuleSet
RuleDefinitions

Footer image

Copyright ©2007 par Microsoft Corporation. Tous droits réservés.