Windows Workflow中的拦截/装饰活动

tha*_*asi 7 .net c# aop workflow-foundation-4

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

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

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


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

tha*_*asi 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);
            }
        }            
    }
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*363 4

查看工作流 TrackingParticipant 类。

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

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

创建一个继承自 TrackingParticipant 的类并重写 Track 方法:

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

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

_workflowApplication.Extensions.Add(_yourWorkFlowTrackingClass);
_workflowApplication.Run();
Run Code Online (Sandbox Code Playgroud)

您还可以将 TrackingRecord 转换为 WorkflowInstanceRecord。ActivityStateRecord 和 WorkflowInstanceRecord 提供了大量有关工作流及其活动的信息。