2009-05-26 5 views
0

Je crée un ActivityToolboxItem pour une activité personnalisée dans WF. J'essaye de faire autant de travail que possible pour les concepteurs dans la méthode CreateComponentsCore. Ce que je suis en train de finir avec est la suivante:Comment créer des règles WF dans du code?

1) Mon activité personnalisée (TriggerActivity, un SequenceActivity), contenant les éléments suivants:
2) TriggerEvaluatorActivity (un simple, activité), qui est lié à une propriété sur le TriggerActivity
3) IfElseActivity, qui a deux branches
4) IfElseBranchActivity qui contient
5) TerminateActivity et
6) Un IfElseBranchActivity qui est vide, à travers laquelle circule l'exécution lorsque la TriggerEvaluatorActivity évalue à vrai.

Les concepteurs désactivent TriggerEvaluatorActivity avec une ou plusieurs implémentations qui effectuent des évaluations complexes dans un contexte d'exécution.

Son assez simple à mettre cela dans le code, mais je suis complètement coincé sur la façon de tourner jusqu'à un ActivityCondition qui sera ajouté à la IfElseBranchActivity pour contrôler le flux d'exécution.

Tout ce que je dois faire est d'évaluer une propriété sur le TriggerEvaluatorActivity. J'ai créé une belle Règle belle via le code dom, mais je ne peux pas mettre cela directement sur le IfElseBranchActivity, je dois mettre la règle quelque part et la référencer dans l'activité. Donc, je suppose que ma question est, une fois que j'ai créé une règle dans le code, comment ajouter ma règle au workflow depuis un ActivityToolboxItem personnalisé pour que les activités que je construis dans le code puissent le référencer?

Répondre

1

Selon this question on MSDN, son stocké dans une propriété de dépendance sous l'activité racine. Je ne sais pas si l'exemple de code est correct ou pas encore.


Travaux. Voici quelques exemples de code:

protected override System.ComponentModel.IComponent[] 
    CreateComponentsCore(System.ComponentModel.Design.IDesignerHost host) 
{ 
    var trigger = new Trigger() { Name = "Trigger" }; 
    var never = new Never() { Name = "NeverTrigger" }; 
    var ifelse = new IfElseActivity() { Name = "IfElse" }; 
    var stop = new TerminateActivity() { Name = "StopJob" }; 
    var failed = new IfElseBranchActivity() { Name = "NotTriggered" }; 
    var succeeded = new IfElseBranchActivity() { Name = "Triggered" }; 
    // build tree 
    failed.Activities.Add(stop); 
    ifelse.Activities.Add(failed); 
    ifelse.Activities.Add(succeeded); 
    trigger.Activities.Add(never); 
    trigger.Activities.Add(ifelse); 
    // create rule if it doesn't already exist 
    var ruleDefinitions = GetRuleDefinitions 
     (host.RootComponent as DependencyObject); 
    if (!ruleDefinitions.Conditions.Contains(RuleName)) 
    { 
     var neverTrigger = 
      new CodePropertyReferenceExpression 
       (new CodeThisReferenceExpression(), 
       "NeverTrigger"); 
     var triggered = 
      new CodePropertyReferenceExpression 
       (neverTrigger, 
       "Triggered"); 
     var falseSide = new CodeBinaryOperatorExpression(); 
     falseSide.Left = triggered; 
     falseSide.Right = new CodePrimitiveExpression(false); 
     falseSide.Operator = CodeBinaryOperatorType.ValueEquality; 

     var ruleCondition = new RuleExpressionCondition 
      (RuleName, falseSide); 


     ruleDefinitions.Conditions.Add(ruleCondition); 
    } 
    // add rule to the failed branch; 
    // don't need a rule for the succeeded branch 
    failed.Condition = new RuleConditionReference() 
     { ConditionName = RuleName }; 

    return new IComponent[] { trigger }; 
} 

private RuleDefinitions GetRuleDefinitions 
    (DependencyObject rootComponent) 
{ 
    var ruleDefinitions = rootComponent.GetValue 
     (RuleDefinitions.RuleDefinitionsProperty) as RuleDefinitions; 
    if (ruleDefinitions == null) 
    { 
     ruleDefinitions = new RuleDefinitions(); 
     rootComponent.SetValue(RuleDefinitions.RuleDefinitionsProperty, 
      ruleDefinitions); 
    } 
    return ruleDefinitions; 
} 
+0

Wow, moi, c'est génial. Ça marche. – Will

+0

Merci, moi. J'ai cependant le sentiment qu'il me manque quelque chose, car ces règles que j'ajoute sont marquées comme invalides par le moteur de règles jusqu'à ce qu'elles soient VUES dans l'éditeur; après les avoir vues, elles sont marquées comme valides. Bizarre. – Will

0

Will -

Il se peut que de nouvelles règles sont signalées jusqu'à ce qu'ils aient été validés. Avez-vous vu si vous pouviez les valider directement après les avoir ajoutés?

Questions connexes