Как я могу создать правила WF в коде? - PullRequest
0 голосов
/ 27 мая 2009

Я создаю ActivityToolboxItem для настраиваемого действия в WF. Я пытаюсь сделать как можно больше работы для дизайнеров в методе CreateComponentsCore. То, что я пытаюсь закончить, является следующим:

1) Моя пользовательская активность ( TriggerActivity , SequenceActivity ), содержащая следующее:
2) A TriggerEvaluatorActivity (простой Activity ), который связан со свойством TriggerActivity
3) IfElseActivity , которое имеет две ветви
4) IfElseBranchActivity , содержащее
5) A TerminateActivity и
6) Пустое значение IfElseBranchActivity , через которое выполняется выполнение, когда TriggerEvaluatorActivity оценивается как true.

Дизайнеры отключают TriggerEvaluatorActivity с одной или несколькими реализациями, которые выполняют сложные оценки в контексте выполнения.

Довольно просто настроить это в коде, но я полностью застрял в том, как ускорить ActivityCondition , который будет добавлен к IfElseBranchActivity для управления потоком выполнение.

Все, что мне нужно сделать, это оценить свойство в TriggerEvaluatorActivity . Я создал прекрасное прекрасное правило с помощью кода dom, но я не могу установить его непосредственно на IfElseBranchActivity , я должен где-то спрятать правило и ссылаться на него в действии.

Итак, я предполагаю, что мой вопрос заключается в том, как после того, как я создал правило в коде, как мне добавить свое правило в рабочий процесс из пользовательского ActivityToolboxItem, чтобы действия, которые я создаю в коде, могли ссылаться на него?

Ответы [ 2 ]

1 голос
/ 27 мая 2009

Согласно этот вопрос в MSDN хранится в свойстве зависимостей в корневом разделе Activity. Не уверен, что пример кода правильный или нет.


Работает. Вот пример кода:

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 голосов
/ 22 июня 2010

Воля -

Возможно, что новые правила помечены, пока они не были проверены. Вы видели, можете ли вы сразу же проверить их сразу после добавления?

...