【问题标题】:How can I create WF rules in code?如何在代码中创建 WF 规则?
【发布时间】:2023-03-18 08:43:01
【问题描述】:

我正在为 WF 中的自定义 Activity 创建一个 ActivityToolboxItem。我正在尝试在 CreateComponentsCore 方法中为设计人员做尽可能多的工作。我想要结束的是以下内容:

1) 我的自定义活动(TriggerActivity,一个SequenceActivity),包含以下内容:
2)一个TriggerEvaluatorActivity(一个简单的Activity),它绑定到TriggerActivity上的一个属性
3) 一个 IfElseActivity,它有两个分支
4) 一个 IfElseBranchActivity 包含
5) TerminateActivity,以及
6) 一个空的 IfElseBranchActivity,当 TriggerEvaluatorActivity 评估为 true 时,执行流经它。

设计人员将 TriggerEvaluatorActivity 切换为一个或多个针对执行上下文执行复杂评估的实现。

在代码中设置它非常简单,但我完全不知道如何启动将添加到 IfElseBranchActivityActivityCondition 以控制执行流程。

我需要做的就是评估 TriggerEvaluatorActivity 上的属性。我通过代码 dom 创建了一个漂亮可爱的规则,但我不能直接在 IfElseBranchActivity 上设置它,我必须将规则存储在某处并在活动中引用它。

所以,我想我的问题是,一旦我在代码中创建了规则,如何将我的规则从自定义 ActivityToolboxItem 中添加到工作流中,以便我在代码中构建的活动可以引用它?

【问题讨论】:

    标签: .net workflow-foundation rule-engine


    【解决方案1】:

    根据this question on 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;
    }
    

    【讨论】:

    • 谢谢,我。然而,我感觉我遗漏了一些东西,因为我添加的这些规则被规则引擎标记为无效,直到它们在编辑器中被查看;查看它们后,它们被标记为有效。很奇怪。
    【解决方案2】:

    会-

    可能会在新规则得到验证之前对其进行标记。添加后是否可以直接验证?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2021-03-19
      相关资源
      最近更新 更多