理解WF的跟踪服务

. WF提供了TrackingService抽象基类,用于为WF应用程序提供跟踪服务。跟踪服务可用一致、可靠而灵活的方式跟踪工作流相关的信息。跟踪框架的宗旨使宿主通过工作流执行期间引发的事件,而在执行期间可用观测到工作流实例。

工作流服务可用引发以下事件:

实例的各类状态

Aborted Changed Completed Created Exception Idle Loaded Persisted Resumed Started Suspended Terminated Unloaded

Activity的各类状态

一个工作流是由多个Activity组成的,每一个Activity都会有一个生命周期,在此期间,Activity会经历多种状态:

Canceling Closed Compensating Executing Faulting Initialized

用户跟踪行为

可以在Activity代码中用TrackData方法向Tacking服务提交自定义状态点

代码实例:

/// <summary> /// 获取并显示工作流实例级别的事件 /// </summary> /// <param name="instanceId"></param> static void GetInstanceTrackingEvents(Guid instanceId) { SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString); //使用SqlTrackingQuery对象查询跟踪数据 SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance; //获取工作流实例跟踪数据。 sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance); if (sqlTrackingWorkflowInstance != null) { Console.WriteLine("/n实例级别的事件:/n"); //遍历并显示工作流实例跟踪数据 foreach (WorkflowTrackingRecord workflowTrackingRecord in sqlTrackingWorkflowInstance.WorkflowEvents) { Console.WriteLine("事件描述 : {0} 日期 : {1}", workflowTrackingRecord.TrackingWorkflowEvent, workflowTrackingRecord.EventDateTime); } } }

/// <summary> /// 获取并显示活动跟踪事件 /// </summary> /// <param name="instanceId"></param> static void GetActivityTrackingEvents(Guid instanceId) { SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString); //查询工作流实例根踪数据 SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance; sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance); if (sqlTrackingWorkflowInstance != null) { Console.WriteLine("/n活动跟踪事件:/n"); //遍历并显示工作流中活动跟踪记录 foreach (ActivityTrackingRecord activityTrackingRecord in sqlTrackingWorkflowInstance.ActivityEvents) { Console.WriteLine("状态描述 : {0} 日期 : {1} 活动资格ID : {2}", activityTrackingRecord.ExecutionStatus, activityTrackingRecord.EventDateTime, activityTrackingRecord.QualifiedName); } } }

二、表结构

WorkflowInstance 工作流实例

WorkflowInstanceInternalId

工作流实例数据库内部号 ,数据库流水号

WorkflowInstanceId

工作流实例GUID

ContextGuid

上下文GUID

CallerInstanceId

CallPath

CallerContextGuid

CallerParentContextGuid

WorkflowTypeId

工作流类型数据库内部号, Workflow.WorkflowTypeId

InitializedDateTime

初始化时间

DbInitializedDateTime

EndDateTime

结束时间

DbEndDateTime

WorkflowInstanceEvent 工作流实例结果

WorkflowInstanceEventId

数据库流水号

WorkflowInstanceInternalId

工作流实例数据库内部号:WorkflowInstance.WorkflowInstanceInternalId

TrackingWorkflowEventId

EventDateTime

结果时间

EventOrder

EventArgTypeId

EventArg

DbEventDateTime

Workflow 工作流模板的类型编号与描绘

WorkflowTypeId

工作流类型数据库内部号,数据库流水号

WorkflowDefinition

XML字串,类型结构的描述

UserEvent 用户跟踪信息

Activity里使用this.TrackData方法添加用户跟踪结果时,数据存储在该表

UserEventId

用户跟踪结果ID,数据库流水号

WorkflowInstanceInternalId

该结果所属的工作流实例的数据ID,

WorkflowInstance.WorkflowInstanceInternalId

EventOrder

ActivityInstanceId

该用户跟踪所属的Activity实例ID

ActivityInstance.ActivityInstanceId

EventDateTime

UserDataKey

用户跟踪结果键,this.TrackData(KEY,DATA)KEY

UserDataTypeId

UserData_Str

用户跟踪结果值,

this.TrackData(KEY,DATA)this.TrackData(DATA)DATA

UserData_Blob

UserDataNonSerializable

DbEventDateTime

Type

所有在工作流中引用的Activity的信息,包括系统自带的与用户自定义的

TypeId

Activity类型数据库内部号,数据库流水号

TypeFullName

Activity名,格式是命名空间,如System.Workflow.Activities.CodeActivity wxd.lzmActivity

AssemblyFullName

格式为版本号,公钥

IsInstanceType

TrackingWorkflowEvent 可跟踪的结果类型码表

TrackingWorkflowEventId

结果编号数据库内部号

Description

描述文字,Created,Completed,Idle,Suspended,Resumed,Persisted,Unloaded,

Loaded,Exception,Terminated,Aborted,Changed,Started

TrackingProfileInstance

InstanceId

TrackingProfileXml

UpdatedDateTime

TrackingProfile

自定义TrackingProfile的数据,自定义跟踪筛选器

TrackingProfileId

TrackingProfile的编号,数据库流水号

Version

版本,

WorkflowTypeId

该筛选器所属的工作流的模板

TrackingProfileXml

筛选器的XML结构

InsertDateTime

插入时间

TrackingPartitionSetName

PartitionId

Name

CreatedDateTime

EndDateTime

PartitionInterval

TrackingPartitionInterval

Interval

TrackingDataItemAnnotation

TrackingDataItemId

WorkflowInstanceInternalId

Annotation

TrackingDataItem

TrackingDataItemId

WorkflowInstanceInternalId

EventId

EventTypeId

FieldName

FieldTypeId

Data_Str

Data_Blob

DataNonSerializable

RemovedActivity

WorkflowInstanceInternalId

WorkflowInstanceEventId

QualifiedName

ParentQualifiedName

RemovedActivityAction

Order

EventAnnotation

WorkflowInstanceInternalId

EventId

EventTypeId

Annotation

DefaultTrackingProfile

默认的TrackPointsXML字串配置文件

Version

版本号

TrackingProfileXml

XML字串的TrackPoints配置文件

InsertDateTime

AddedActivity

WorkflowInstanceInternalId

WorkflowInstanceEventId

QualifiedName

ActivityTypeId

ParentQualifiedName

AddedActivityAction

Order

ActivityInstance

每个实例的每个Activity的信息

WorkflowInstanceInternalId

所属的工作流实例:WorkflowInstance.WorkflowInstanceInternalId

ActivityInstanceId

Activity状态流水号,数据库内部号

QualifiedName

Activity,调计时Activity的名子

ContextGuid

GUID

ParentContextGuid

GUID

WorkflowInstanceEventId

ActivityExecutionStatusEvent

每个实例的每个Activity的执行状态结果

ActivityExecutionStatusEventId

Activity实例流水号,数据库内部号

WorkflowInstanceInternalId

所属的工作流实例:

WorkflowInstance.WorkflowInstanceInternalId

EventOrder

ActivityInstanceId

执行状态,ActivityExecutionStatus.ExecutionStatusId

ExecutionStatusId

EventDateTime

DbEventDateTime

ActivityExecutionStatus

Activity执行状态码表

ExecutionStatusId

状态流水号,数据库内部号

Description

描述文字,Initialized,Executing,Canceling,Closed,Compensating,Faulting

Activity

每个工作流模板中的Activity与工作流模板,及Activity类型的关系

WorkflowTypeId

所属工作流模板,Workflow.WorkflowTypeId

QualifiedName

Activity的代码名

ActivityTypeId

Activity的类型, Type.TypeId

ParentQualifiedName

Activity的父容器名,为空表示为工作流主容器

存储过程

GetTrackingProfile 得到自定义筛选器的版本

得到Profile版本,(得到自定义筛选器的版本)

@TypeFullName

值为要查询的工作流类的类名: typeof(wxdlzm1).ToString() typeof(wxdlzm1).FullName

@AssemblyFullName

值为要查询工作流类的全称名: typeof(wxdlzm1).Assembly.FullName

@Version

@CreateDefault

UpdateTrackingProfile 插入自定义筛选器到TrackingProfile

插入ProfileTrackingProfile表,(插入自定义筛选器到TrackingProfile)

@TypeFullName

值为要设置工作流类的类名: typeof(wxdlzm1).ToString()

@AssemblyFullName

值为要设置工作流类的全称名: typeof(wxdlzm1).Assembly.FullName

@Version

值为要指定的片本号的字串:格式"3.0.0.7"

@TrackingProfileXml

值为TrackingProfile格式的XML字串

. TrackingProfile跟踪服务筛选器

1.Tacking服务所要记录的状态是可以通过自定义Tacking Pofile进行筛选的.

2.默认Tacking服务对 [实例的各类状态][Activity的各类状态][用户跟踪行为]的所有状态进行记录,

3.可以自定义自定义Tacking PofileTacking服务只记录实际需要的状态.

4.以下各类状态变化可被Tacking服务记录,也可用Tacking Pofile进行筛选:

实例的各类状态

Aborted Changed Completed Created Exception Idle Loaded Persisted Resumed Started Suspended Terminated Unloaded

Activity的各类状态

一个工作流是由多个Activity组成的,

每一个Activity都会有一个生命周期,在此期间,Activity会经历多种状态:

Canceling Closed Compensating Executing Faulting Initialized

用户跟踪行为

可以在Activity代码中用TrackData方法向Tacking服务提交自定义状态点

5.自定义Tacking Pofile将生成一个XML,存入TrackingProfile表的TrackingProfileXml字段中

6.默认的Tacking Pofile以一个XML串的形式存于DefaultTrackingProfile表的TrackingProfileXml字段中

7.自定义Tacking Pofile只对指定的工作流有效,默认的Tacking Pofile对所有没有自定义Tacking Pofile的工作流有效。

8.如果所有工作流要使用同样的筛选,可以直接修改默认的Tacking Pofile

9.如果同一对象已添加自定义的Tacking Pofile,使用默认方式再添加时,将出产生异常,该异常由UpdateTrackingProfile存储过程产生.

10.完全可以手工操作PofileXML串,也可以手工操作Tacking数据

一个TrackingProfile跟踪服务筛选类

using System; using System.Collections.Generic; using System.Text; using System.Workflow.Runtime.Tracking; using System.Workflow.ComponentModel; using System.IO; using System.Data.SqlClient; using System.Globalization; using System.Data; namespace wxwinter.wf.Service { public class TrackingProfileManager { /// <summary> /// 生成一个自定义Profile /// </summary> /// <param name="version">格式3.0.0.0</param> /// <returns></returns> public static TrackingProfile createProfile(string version) { Version ver = new Version(version); //格式3.0.0.0 //版本信息同时存在"TrackingProfile表Version字段"与"Profile的XML字串"中 #region <TrackingProfile>结点 //根结点 TrackingProfile profile = new TrackingProfile(); //<TrackingProfile>结点 profile.Version = ver;//此处用来写XML文件中的version="3.0.0.0" #endregion #region <ActivityTrackPoint>结点 //筛选Activity跟踪点的设置 //<ActivityTrackingLocation>结点 ActivityTrackingLocation NodeActivityTrackingLocation = new ActivityTrackingLocation(typeof(Activity)); foreach (ActivityExecutionStatus status in Enum.GetValues(typeof(ActivityExecutionStatus))) { NodeActivityTrackingLocation.ExecutionStatusEvents.Add(status); } //<MatchingLocations>结 NodeActivityTrackingLocation.MatchDerivedTypes = true; //<ActivityTrackPoint>结点 ActivityTrackPoint NodeActivityTrackPoint = new ActivityTrackPoint(); //写入结 NodeActivityTrackPoint.MatchingLocations.Add(NodeActivityTrackingLocation); profile.ActivityTrackPoints.Add(NodeActivityTrackPoint); #endregion #region <WorkflowTrackPoint>结点 //筛选实例跟踪点的设置 //<WorkflowTrackingLocation>结点 WorkflowTrackingLocation NodeWorkflowTrackingLocation = new WorkflowTrackingLocation(); foreach (TrackingWorkflowEvent wEvent in Enum.GetValues(typeof(TrackingWorkflowEvent))) { NodeWorkflowTrackingLocation.Events.Add(wEvent); } //<WorkflowTrackPoint>结点 WorkflowTrackPoint NodeWorkflowTrackPoint = new WorkflowTrackPoint(); //<MatchingLocation>结点 NodeWorkflowTrackPoint.MatchingLocation = NodeWorkflowTrackingLocation; //写放结点 profile.WorkflowTrackPoints.Add(NodeWorkflowTrackPoint); #endregion #region <UserTrackPoint>结点 //筛选用户跟踪点的设置 //<UserTrackPoint>结点 UserTrackPoint NodeUserTrackPoint = new UserTrackPoint(); //<UserTrackingLocation>结点 UserTrackingLocation NodeUserTrackingLocation; //对CodeActivity控件进行监视 NodeUserTrackingLocation = new UserTrackingLocation(typeof(string), typeof(System.Workflow.Activities.CodeActivity)); //************************************************************************************************ //注:要监视所有用Activity参数,包括Policy的规则活动 //使用 //{ //UserTrackingLocation NodeUserTrackingLocation1= new UserTrackingLocation(); //NodeUserTrackingLocation1.ActivityType = typeof(Activity); //NodeUserTrackingLocation1.ArgumentType = typeof(object); //NodeUserTrackingLocation1.MatchDerivedArgumentTypes = true; //NodeUserTrackingLocation1.MatchDerivedActivityTypes = true; //} //************************************************************************************************ //<MatchingLocation>结点 NodeUserTrackingLocation.MatchDerivedActivityTypes = true; //写入结点 NodeUserTrackPoint.MatchingLocations.Add(NodeUserTrackingLocation); profile.UserTrackPoints.Add(NodeUserTrackPoint); #endregion return profile; } /// <summary> /// 生成一个全监视的profile /// </summary> /// <param name="version">格式3.0.0.0</param> /// <returns></returns> public static TrackingProfile createAllProfile(string version) { TrackingProfile profile = new TrackingProfile(); profile.Version = new Version(version); //结点跟踪 ActivityTrackPoint trackPoint_Activity = new ActivityTrackPoint(); ActivityTrackingLocation location = new ActivityTrackingLocation(typeof(Activity)); location.MatchDerivedTypes = true; foreach (ActivityExecutionStatus s in Enum.GetValues(typeof(ActivityExecutionStatus))) { location.ExecutionStatusEvents.Add(s); } trackPoint_Activity.MatchingLocations.Add(location); profile.ActivityTrackPoints.Add(trackPoint_Activity); //用户跟踪 UserTrackPoint trackPoint_User = new UserTrackPoint(); UserTrackingLocation UserTrackingLocation标记= new UserTrackingLocation(); UserTrackingLocation标记.ActivityType = typeof(Activity); UserTrackingLocation标记.ArgumentType = typeof(object); UserTrackingLocation标记.MatchDerivedArgumentTypes = true; UserTrackingLocation标记.MatchDerivedActivityTypes = true; trackPoint_User.MatchingLocations.Add(UserTrackingLocation标记); profile.UserTrackPoints.Add(trackPoint_User); //工作流跟踪 WorkflowTrackPoint trackPoint_WF = new WorkflowTrackPoint(); trackPoint_WF.MatchingLocation = new WorkflowTrackingLocation(); foreach (TrackingWorkflowEvent workflowEvent in Enum.GetValues(typeof(TrackingWorkflowEvent))) { trackPoint_WF.MatchingLocation.Events.Add(workflowEvent); } profile.WorkflowTrackPoints.Add(trackPoint_WF); //--------------------------- return profile; } /// <summary> /// 得到Profile对象的XML字串 /// </summary> public static string getProfileXMLString(TrackingProfile profile) { TrackingProfileSerializer serializer = new TrackingProfileSerializer(); StringWriter writer = new StringWriter(new StringBuilder(), CultureInfo.InvariantCulture); serializer.Serialize(writer, profile); string xmlstring = writer.ToString(); return xmlstring; } /// <summary> /// 从磁盘文件中加载TrackingProfile对象 /// </summary> /// <param name="path"></param> /// <returns></returns> public static TrackingProfile loadProfileFromFile(string path) { FileStream fileStream = null; fileStream = File.OpenRead(path); StreamReader reader = new StreamReader(fileStream); TrackingProfile profile; TrackingProfileSerializer serializer = new TrackingProfileSerializer(); profile = serializer.Deserialize(reader); fileStream.Close(); return profile; } /// <summary> /// 从XML字符串加载TrackingProfile /// </summary> /// <param name="xmlstring"></param> /// <returns></returns> public static TrackingProfile loadProrileFromXmlstring(string xmlstring) { TrackingProfileSerializer serializer = new TrackingProfileSerializer(); StringReader reader = null; reader = new StringReader(xmlstring); TrackingProfile profile = serializer.Deserialize(reader); return profile; } /// <summary> /// 保存XML字串到磁盘 /// </summary> public static void saveXMLStringToFile(string xmlstring, string path) { System.Xml.XmlDocument doc= new System.Xml.XmlDocument(); doc.LoadXml(xmlstring); doc.Save(path); } /// <summary> /// 从SQLServer中得到指定工作流的Profile /// </summary> public static TrackingProfile getProfileFromSqlserver(string conString, System.Type WorkflowType) { //调用存储过程GetTrackingProfile string sql = conString; TrackingProfile profile = null; SqlDataReader rd = null; SqlCommand command = new SqlCommand(); command.CommandType = CommandType.StoredProcedure; command.CommandText = "dbo.GetTrackingProfile"; command.Connection = new SqlConnection(sql); //------------------------------------------------ //参数:@TypeFullName SqlParameter typeFullName = new SqlParameter(); typeFullName.ParameterName = "@TypeFullName"; typeFullName.SqlDbType = SqlDbType.NVarChar; //值为要查询的工作流类的类名: typeof(wxdlzm1).ToString() 或typeof(wxdlzm1).FullName typeFullName.SqlValue = WorkflowType.FullName; // command.Parameters.Add(typeFullName); //------------------------------------------------ //参数:@AssemblyFullName SqlParameter assemblyFullName = new SqlParameter(); assemblyFullName.ParameterName = "@AssemblyFullName"; assemblyFullName.SqlDbType = SqlDbType.NVarChar; //值为要查询工作流类的全称名: typeof(wxdlzm1).Assembly.FullName assemblyFullName.SqlValue = WorkflowType.Assembly.FullName; command.Parameters.Add(assemblyFullName); //------------------------------------------------ //参数:@Version SqlParameter versionId = new SqlParameter(); versionId.ParameterName = "@Version"; versionId.SqlDbType = SqlDbType.VarChar; command.Parameters.Add(versionId); //------------------------------------------------ //参数:@CreateDefault SqlParameter createDefault = new SqlParameter(); createDefault.ParameterName = "@CreateDefault"; createDefault.SqlDbType = SqlDbType.Bit; createDefault.SqlValue = 0; command.Parameters.Add(createDefault); //------------------------------------------------ command.Connection.Open(); rd = command.ExecuteReader(); if (rd.Read()) { string xmlstring = rd[0] as string; if (null != xmlstring) { profile = loadProrileFromXmlstring(xmlstring); } } return profile; } /// <summary> /// 从SQLServer中得到指定工作流的SQLProfile版本 /// </summary> public static Version getProfileVerFromSqlserver(string conString, System.Type WorkflowType) { TrackingProfile profile = getProfileFromSqlserver(conString, WorkflowType); if (profile != null) { return new Version(profile.Version.ToString()); } else {//如果数据库中没有,就返回"0.0.0.0"格式,表示没有,此为自定义约定 return new Version("0.0.0.0"); } } /// <summary> /// 将profile字符串保存到数据库 /// </summary> /// <param name="xmlString">profile字符串</param> /// <param name="conString">数据库连接字串</param> /// <param name="WorkflowType">profile所应用到的工作流</param> /// <param name="version">版本,格式3.0.0.0</param> public static void saveProfileXmlStringToSQLServer(string xmlString, string conString, System.Type WorkflowType, Version version) { string sql = conString; SqlCommand command = new SqlCommand(); command.CommandType = CommandType.StoredProcedure; command.CommandText = "dbo.UpdateTrackingProfile"; command.Connection = new SqlConnection(sql); //------------------------------------------------------------- //参数:@TypeFullName SqlParameter typeFullName = new SqlParameter(); typeFullName.ParameterName = "@TypeFullName"; typeFullName.SqlDbType = SqlDbType.NVarChar; //值为要设置工作流类的类名typeof(wxdlzm1).ToString() typeFullName.SqlValue = WorkflowType.ToString(); command.Parameters.Add(typeFullName); //------------------------------------------------------------- //参数:@AssemblyFullName SqlParameter assemblyFullName = new SqlParameter(); assemblyFullName.ParameterName = "@AssemblyFullName"; assemblyFullName.SqlDbType = SqlDbType.NVarChar; //值为要设置工作流类的全称名typeof(wxdlzm1).Assembly.FullName assemblyFullName.SqlValue = WorkflowType.Assembly.FullName; command.Parameters.Add(assemblyFullName); //------------------------------------------------------------- //TrackingProfile表Version字段 SqlParameter versionId = new SqlParameter(); versionId.ParameterName = "@Version"; versionId.SqlDbType = SqlDbType.VarChar; //值为要指定的片本号的字串:格式"3.0.0.7" versionId.SqlValue = version.ToString(); command.Parameters.Add(versionId); //------------------------------------------------------------- //TrackingProfile表TrackingProfileXml字段 SqlParameter trackingProfile = new SqlParameter(); trackingProfile.ParameterName = "@TrackingProfileXml"; trackingProfile.SqlDbType = SqlDbType.NVarChar; //值为TrackingProfile格式的XML字串 trackingProfile.SqlValue = xmlString; command.Parameters.Add(trackingProfile); //------------------------------------------------------------- command.Connection.Open(); command.ExecuteNonQuery(); } } }

四。 TrackingServiceTrackingChannel自定义跟踪服务

WF提供一个tracking基本结构,可以用他去跟踪实例改变的数据与状态,

需要实现TrackingChannel TrackingServic这两个类,

TrackingChannel接收引擎发送的各种tracking记录,

TrackingServic为引擎提供了接口

引擎调用tracking服务是同步的,工作流实例执行一个阻塞直到从tracking服务有方法返回

WF的工作流引擎是个黑箱子,所有有关工作流实例运行的情况或事件只有WF引擎知道,Hosting如果想知道,那么需要一个查询的界面。Tracking就是这个查询界面

public class Tracking通道 : TrackingChannel { private TrackingParameters 被跟踪的实例 = null; public Tracking通道(TrackingParameters parameters) { this.被跟踪的实例 = parameters; } //Tracking runtime调用该方将实例完成的信息向外界抛 protected override void InstanceCompletedOrTerminated() { Console.WriteLine("实例:" + 被跟踪的实例.InstanceId.ToString()); } //Tracking runtime调用该方法发送将监视到的各类tracking records向外界抛出 protected override void Send(TrackingRecord record) { //筛选实例 if (record is WorkflowTrackingRecord) { WorkflowTrackingRecord obj1 = (WorkflowTrackingRecord)record; Console.WriteLine("时间: " + obj1.EventDateTime.ToString()); } //筛选结点 if (record is ActivityTrackingRecord) { ActivityTrackingRecord obj2 = (ActivityTrackingRecord)record; Console.WriteLine("时间: " + obj2.EventDateTime.ToString()); } //筛选业务状态点(用户状态点) if (record is UserTrackingRecord) { UserTrackingRecord obj3= (UserTrackingRecord)record; Console.WriteLine("实例:" + 被跟踪的实例.InstanceId.ToString()); Console.WriteLine("时间: " + obj3.EventDateTime.ToString()); //筛选业务状态点(用户状态点)中的规则 if (obj3.UserData is System.Workflow.Activities.Rules.RuleActionTrackingEvent) { RuleActionTrackingEvent obj3_rule = (RuleActionTrackingEvent)obj3.UserData; Console.WriteLine("规则名: " + obj3_rule.RuleName.ToString()); //Policy绑定的规则集中的每个规则都会发送一组状态,Policy有点像职责链,具体以后讲 //Policy规则是自动将信息抛出的,但在类型上算上用户状态 } } } }
TrackingService实现

public class 自定义跟踪服务 : TrackingService { protected override bool TryGetProfile(Type workflowType, out TrackingProfile profile) { //引擎通过该方法加载监视方案 //可在该方法内为工作流模板与对应的筛选建一字典集合, //该演示设计成所有工作流都使用同一筛选规则方式 //参数:workflowType,传入的类型,用于在字典集合中查找对应的筛选规则 //参数:out profile,传地址抛出筛选规则 profile = 生成一个Profile(); return true; //表示找到所指定的类型对应的筛选规则 } protected override TrackingProfile GetProfile(Guid workflowInstanceId) { //跟据实例查对应的规则 //可用字典集实现 return 生成一个Profile(); } protected override TrackingProfile GetProfile(Type workflowType, Version profileVersionId) { //返回指定工作流模板的指定版本号的筛选规则 //参数:profileVersionId,版本号 //可用字典集实现 return 生成一个Profile(); } protected override bool TryReloadProfile(Type workflowType, Guid workflowInstanceId, out TrackingProfile profile) { //重载指定工作流模板的筛选规则 //参数:workflowType., //参数:workflowInstanceId, //参数:out profile, profile = null; return false; } protected override TrackingChannel GetTrackingChannel(TrackingParameters parameters) { //用TrackingParameters参数初始化信道 return new Tracking通道(parameters); } // 建立自定义的TrackingProfile 关于自定义TrackingProfile 见相关 private static TrackingProfile 生成一个Profile() {//一个全监视的profile TrackingProfile profile = new TrackingProfile(); profile.Version = new Version("4.3.2.1"); ActivityTrackPoint 结点跟踪点对象= new ActivityTrackPoint(); ActivityTrackingLocation location = new ActivityTrackingLocation(typeof(Activity)); location.MatchDerivedTypes = true; foreach (ActivityExecutionStatus s in Enum.GetValues(typeof(ActivityExecutionStatus))) { location.ExecutionStatusEvents.Add(s); } 结点跟踪点对象.MatchingLocations.Add(location); profile.ActivityTrackPoints.Add(结点跟踪点对象); UserTrackPoint 用户跟踪点对象= new UserTrackPoint(); UserTrackingLocation UserTrackingLocation标记= new UserTrackingLocation(); UserTrackingLocation标记.ActivityType = typeof(Activity); UserTrackingLocation标记.ArgumentType = typeof(object); UserTrackingLocation标记.MatchDerivedArgumentTypes = true; UserTrackingLocation标记.MatchDerivedActivityTypes = true; 用户跟踪点对象.MatchingLocations.Add(UserTrackingLocation标记); profile.UserTrackPoints.Add(用户跟踪点对象); WorkflowTrackPoint 实例跟踪点对象= new WorkflowTrackPoint(); 实例跟踪点对象.MatchingLocation = new WorkflowTrackingLocation(); foreach (TrackingWorkflowEvent workflowEvent in Enum.GetValues(typeof(TrackingWorkflowEvent))) { 实例跟踪点对象.MatchingLocation.Events.Add(workflowEvent); } profile.WorkflowTrackPoints.Add(实例跟踪点对象); return profile; } }

注:本文大部分来自:http://www.cnblogs.com/foundation/category/212578.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值