Windows Workflow Foundation是否提供了一种拦截或装饰活动的方法,例如记录?例如,为每个活动入口和出口点创建日志(理想情况下包括活动名称),而不修改所有现有项目代码。
例如,我有一个工作流程,其中包含一个可以打印" Hello world"的活动。在不修改XAML文件的情况下,我想捕获活动的进入和退出。我想打印"进入Hello World Activity"在进入活动之前和活动打印完毕后,我想打印#34;完成Hello World活动"。
Windows Workflow是否提供了挂钩进入和退出活动的机制?
@ Richard210363已经在评论中添加了Windows Workflow Foundation支持此功能 - 那么选择关闭此问题的用户是否可以考虑撤销他们的决定,因为问题显然使用相关框架有一个非常具体的答案?
答案 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提供了很多关于工作流及其活动的信息。