Windows Workflow中的拦截/装饰活动

时间:2014-08-27 13:31:44

标签: c# .net aop workflow-foundation-4

Windows Workflow Foundation是否提供了一种拦截或装饰活动的方法,例如记录?例如,为每个活动入口和出口点创建日志(理想情况下包括活动名称),而不修改所有现有项目代码。

例如,我有一个工作流程,其中包含一个可以打印" Hello world"的活动。在不修改XAML文件的情况下,我想捕获活动的进入和退出。我想打印"进入Hello World Activity"在进入活动之前和活动打印完毕后,我想打印#34;完成Hello World活动"。

Windows Workflow是否提供了挂钩进入和退出活动的机制?


@ Richard210363已经在评论中添加了Windows Workflow Foundation支持此功能 - 那么选择关闭此问题的用户是否可以考虑撤销他们的决定,因为问题显然使用相关框架有一个非常具体的答案?

2 个答案:

答案 0 :(得分:5)

我编写了以下代码,可以跟踪所有工作流程和活动。

public class ActivityTracker : TrackingParticipant
{
    protected override void Track(TrackingRecord record, TimeSpan timeout)
    {            
        if (record != null)
        {
            if (record is WorkflowInstanceRecord)
            {
                WorkflowInstanceRecord instanceRecord = record as WorkflowInstanceRecord;
                Console.WriteLine("Workflow Record: Instance: {0} - State: {1} - Definition Identity: {2}", instanceRecord.ActivityDefinitionId, instanceRecord.State, instanceRecord.WorkflowDefinitionIdentity);
            }
            else if (record is ActivityStateRecord)
            {
                ActivityStateRecord instanceRecord = record as ActivityStateRecord;
                Console.WriteLine("Activity Record: Name: {0} - State: {1}", instanceRecord.Activity.Name, instanceRecord.State);
            }
        }            
    }
}

答案 1 :(得分:3)

查看工作流TrackingParticipant类。

它在工作流程中的所有活动中起作用,类似于范围内的AOP。

它会发出有关活动进入和退出的信息。

创建一个继承自TrackingParticipant的类并覆盖Track方法:

protected override void Track(TrackingRecord record, TimeSpan timeout)
    {
        ActivityStateRecord activityStateRecord = record as ActivityStateRecord;
        string CurrentActivityName = activityStateRecord.Activity.Name,
    }

然后在运行之前将跟踪类附加到工作流程。

_workflowApplication.Extensions.Add(_yourWorkFlowTrackingClass);
_workflowApplication.Run();

您还可以将TrackingRecord投射到WorkflowInstanceRecord。在它们之间,ActivityStateRecord和WorkflowInstanceRecord提供了很多关于工作流及其活动的信息。