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支持此功能 - 请选择关闭此问题的用户是否可以考虑撤销他们的决定,因为问题显然有一个非常具体的答案使用相关框架?
我编写了以下代码,可以跟踪所有工作流程和活动.
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)
查看工作流 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 提供了大量有关工作流及其活动的信息。
| 归档时间: |
|
| 查看次数: |
411 次 |
| 最近记录: |