拦截/装饰Windows Workflow中的活动

6
Windows Workflow Foundation是否提供拦截或装饰活动的方法,例如记录日志?例如,为了在不修改所有现有项目代码的情况下为每个活动条目和退出点(最好包括活动名称)创建日志。
例如,我有一个工作流,其中包含一个打印“Hello world”的单个活动。我想在不修改XAML文件的情况下捕获活动的入口和出口。我想在进入活动之前打印“进入Hello World Activity”,并在活动打印“Hello World”之后打印“完成Hello World Activity”。
Windows Workflow是否提供一种机制来钩入活动的进入和退出?
@Richard210363已经在评论中添加了此功能受到Windows Workflow Foundation支持 - 请关闭此问题的用户考虑撤销他们的决定,因为问题明显具有使用相关框架的非常具体的答案。

2
请查看Workflow TrackingParticipant类。在运行之前,您需要将其附加到工作流中:_workflowApplication.Extensions.Add(TrackingParticipant)。它的作用范围类似于AOP,涵盖工作流中的所有活动。它会发出有关活动进入和退出的信息。您应该从TrackingParticipant进行继承,并覆盖Track方法:protected override void Track(TrackingRecord record, TimeSpan timeout)。然后将TrackingRecord转换为ActivityStateRecord。活动名称是ActivityStateRecord.Activity.Name。 - Richard210363
请参见:http://msdn.microsoft.com/zh-cn/library/jj205426(v=vs.110).aspx - Richard210363
3
这个问题在WWF方面是完全合理的,并且有一个简单的答案,请取消保留状态。 - Richard210363
@Richard210363 - 这个问题已经重新开放了 - 你想要添加答案吗? - qujck
1
我已经在下面添加了清理过的答案。 - Richard210363
显示剩余2条评论
2个回答

4

请查看工作流程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两者都提供了有关工作流及其活动的大量信息。

你的解决方案按预期工作。非常感谢。我已经发布了下面跟踪所有工作流和活动的完整源代码。 - thangamanikasi
非常高兴你成功了。如果可以的话,能否将我标记为答案。 - Richard210363

4
我编写了以下代码,可以跟踪所有工作流程和活动。
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);
            }
        }            
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接