如何在代码中创建 WF 规则?

发布于 2024-07-20 22:31:40 字数 1023 浏览 3 评论 0原文

我正在为 WF 中的自定义活动创建一个 ActivityToolboxItem 。 我试图在 CreateComponentsCore 方法中为设计人员做尽可能多的工作。 我想要得到的结果如下:

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

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

在代码中设置它非常简单,但我完全困惑于如何启动一个 ActivityCondition ,它将添加到 IfElseBranchActivity 中以控制执行流程。

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

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

I'm creating an ActivityToolboxItem for a custom Activity in WF. I'm trying to do as much work as possible for the designers within the CreateComponentsCore method. What I'm trying to end up with is the following:

1) My custom activity (TriggerActivity, a SequenceActivity), containing the following:
2) A TriggerEvaluatorActivity (a simple Activity), which is bound to a property on the TriggerActivity
3) An IfElseActivity, which has two branches
4) An IfElseBranchActivity that contains
5) A TerminateActivity, and
6) An IfElseBranchActivity that is empty, through which execution flows when the TriggerEvaluatorActivity evaluates to true.

Designers switch out the TriggerEvaluatorActivity with one or more implementations that perform complex evaluations against an execution context.

Its pretty simple to set this up in code, but I'm completely stuck on how to spin up an ActivityCondition that will be added to the IfElseBranchActivity to control the flow of execution.

All I need to do is evaluate a property on the TriggerEvaluatorActivity. I've created a nice lovely Rule via the code dom, but I can't set that directly on the IfElseBranchActivity, I have to stash the rule somewhere and reference it in the activity.

So, I guess my question is, once I've created a rule in code, how do I add my rule to the workflow from within a custom ActivityToolboxItem so that the activities I build in code can reference it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

感情废物 2024-07-27 22:31:40

根据这个问题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;
}

According to this question on MSDN, its stored in a dependency property under the root Activity. Not sure if the code example is correct or not yet.


Works. Here's some sample 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;
}
ゞ花落谁相伴 2024-07-27 22:31:40

意愿 -

新规则可能会被标记,直到它们得到验证。 您是否看到添加后是否可以立即直接验证它们?

Will -

It may be that new rules are flagged until they have been validated. Did you see if you could directly validating them immediately after adding them?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文