Как я могу создавать правила WF в коде?
-
06-09-2019 - |
Вопрос
Я создаю ActivityToolboxItem Элемент ActivityToolboxItem для пользовательского действия в WF.Я пытаюсь выполнить как можно больше работы для дизайнеров в рамках метода CreateComponentsCore.В итоге я пытаюсь получить следующее:
1) Моя пользовательская активность (Триггерактивность, а Последовательность действий), содержащий следующее:
2) А triggerevaluatorактивность (простой Активность), который привязан к свойству TriggerActivity
3) Ан IfElseActivity ( если активен ), который имеет две ветви
4) Ан ifelsebranchактивность который содержит
5) А Завершать активность, и
6) Ан ifelsebranchактивность это пустое значение, через которое выполняется выполнение, когда TriggerEvaluatorActivity принимает значение true .
Дизайнеры переключают triggerevaluatorактивность с одной или несколькими реализациями, которые выполняют сложные вычисления в контексте выполнения.
Настроить это в коде довольно просто, но я полностью зациклен на том, как раскрутить Условие активности это будет добавлено к ifelsebranchактивность для управления потоком выполнения.
Все, что мне нужно сделать, это оценить свойство на triggerevaluatorактивность.Я создал приятное правило lovely с помощью code dom, но я не могу установить его непосредственно на ifelsebranchактивность, Я должен где-нибудь спрятать правило и ссылаться на него в упражнении.
Итак, я предполагаю, что мой вопрос заключается в следующем: как только я создам правило в коде, как мне добавить мое правило в рабочий процесс из пользовательского ActivityToolboxItem, чтобы действия, которые я создаю в коде, могли ссылаться на него?
Решение
Согласно этот вопрос в MSDN, он хранится в свойстве dependency в корневом 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;
}
Другие советы
Будет -
Может случиться так, что новые правила будут помечены до тех пор, пока они не будут проверены.Видели ли вы, можете ли вы напрямую проверить их сразу после добавления?