自定义PersistenceService类

该例自定义了一个将实例持久化到磁盘文的操作,分两部分
第一部分是实现PersistenceService类,第二部分是操作磁盘的功能类,本例中的[test]是一个自定义的console的输出类,功能就是实现console.write("内容")

实现PersistenceService类
None.gif Imports  System
None.gif
Imports  System.Workflow.ComponentModel
None.gif
Imports  System.Workflow.Runtime.Hosting
None.gif
Imports  System.Collections.Specialized
None.gif
Imports  System.Workflow.Runtime
None.gif
ExpandedBlockStart.gifContractedBlock.gif
Public   Class 自定义Persistence服务 Class 自定义Persistence服务
InBlock.gif    
Inherits WorkflowPersistenceService
InBlock.gif    
'当实例进入Idle状态时,引擎是否自动调用unload
InBlock.gif
    '为True 时,当实例进入Idle状态时,引擎自动调用实例的unload方法,
InBlock.gif
    '具体见 SqlWorkflowPersistenceService类 的
InBlock.gif
    
InBlock.gif    
Private unloadOnIdleValue As Boolean = False
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
Public Sub New()Sub New()
InBlock.gif
'注本服务默认为进入Idle状态的的实例不被引擎自动调用unload方法
ExpandedSubBlockEnd.gif
    End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Sub New()Sub New(ByVal unloadOnIdle As Boolean)
InBlock.gif        
'跟据传入的参数,操作当前实例的操作模式值:unloadOnIdleValue
InBlock.gif
        unloadOnIdleValue = unloadOnIdle
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif    
' 载入已完成的activity
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Protected Overrides Function LoadCompletedContextActivity()Function LoadCompletedContextActivity(ByVal scopeId As System.Guid, ByVal outerActivity As System.Workflow.ComponentModel.Activity) As System.Workflow.ComponentModel.Activity
InBlock.gif        
'有个 out 参数 outerActivity
InBlock.gif
        Dim a As New System.Collections.ArrayList
InBlock.gif        a.Add(
"实例:" + scopeId.ToString)
InBlock.gif        test.持久化(
"准备:载入已完成的activity:LoadCompletedContextActivity", a)
InBlock.gif        
Dim obj As Object = 磁盘文件操作.加载(scopeId, outerActivity)
InBlock.gif        
Return CType(obj, Activity)
ExpandedSubBlockEnd.gif    
End Function

InBlock.gif
InBlock.gif    
' 载入实例
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Protected Overrides Function LoadWorkflowInstanceState()Function LoadWorkflowInstanceState(ByVal instanceId As System.Guid) As System.Workflow.ComponentModel.Activity
InBlock.gif        
Dim a As New System.Collections.ArrayList
InBlock.gif        a.Add(
"实例:" + instanceId.ToString)
InBlock.gif        test.持久化(
"准备:载入实例:LoadWorkflowInstanceState", a)
InBlock.gif        
Dim obj As Object = 磁盘文件操作.加载(instanceId, Nothing)
InBlock.gif        
Return CType(obj, Activity)
ExpandedSubBlockEnd.gif    
End Function

InBlock.gif
InBlock.gif    
'保存已完成的状态
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Protected Overrides Sub SaveCompletedContextActivity()Sub SaveCompletedContextActivity(ByVal activity As System.Workflow.ComponentModel.Activity)
InBlock.gif        
Dim contextGuid As Guid = CType(activity.GetValue(activity.ActivityContextGuidProperty), Guid)
InBlock.gif        
Dim a As New System.Collections.ArrayList
InBlock.gif        a.Add(
"实例:" + contextGuid.ToString)
InBlock.gif        test.持久化(
"准备:保存已完成的状态:SaveCompletedContextActivity", a)
InBlock.gif        磁盘文件操作.保存(activity, contextGuid, 
True)
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif    
' 保存实例
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Protected Overrides Sub SaveWorkflowInstanceState()Sub SaveWorkflowInstanceState(ByVal rootActivity As System.Workflow.ComponentModel.Activity, ByVal unlock As Boolean)
InBlock.gif
InBlock.gif
InBlock.gif        
Dim contextGuid As Guid = CType(rootActivity.GetValue(Activity.ActivityContextGuidProperty), Guid)
InBlock.gif        
Dim a As New System.Collections.ArrayList
InBlock.gif        a.Add(
"实例:" + contextGuid.ToString)
InBlock.gif        a.Add(
"unlock:" + unlock.ToString())
InBlock.gif        test.持久化(
"准备:保存实例:SaveWorkflowInstanceState", a)
InBlock.gif       磁盘文件操作.保存(rootActivity, contextGuid, 
unlock)
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif    
'对锁定的实例解锁,使实例可被操作
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Protected Overrides Sub UnlockWorkflowInstanceState()Sub UnlockWorkflowInstanceState(ByVal rootActivity As System.Workflow.ComponentModel.Activity)
InBlock.gif        
Dim contextGuid As Guid = CType(rootActivity.GetValue(Activity.ActivityContextGuidProperty), Guid)
InBlock.gif        
Dim a As New System.Collections.ArrayList
InBlock.gif        a.Add(
"被解锁的实例:" + contextGuid.ToString)
InBlock.gif        test.持久化(
"准备:对锁定的实例解锁:UnlockWorkflowInstanceState", a)
InBlock.gif        磁盘文件操作.Unlock(contextGuid)
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif    
'返回对进入IDLE状态的实例的解决模式
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Protected Overrides Function UnloadOnIdle()Function UnloadOnIdle(ByVal rootActivity As System.Workflow.ComponentModel.Activity) As Boolean
InBlock.gif        
'为True 时,当实例进入Idle状态时,引擎自动调用实例的unload方法,
InBlock.gif
        Dim contextGuid As Guid = CType(rootActivity.GetValue(Activity.ActivityContextGuidProperty), Guid)
InBlock.gif        
Dim a As New System.Collections.ArrayList
InBlock.gif        a.Add(
"模式值:" + unloadOnIdleValue.ToString())
InBlock.gif        a.Add(
"实例:" + contextGuid.ToString())
InBlock.gif        test.持久化(
"返回对进入IDLE状态的实例的解决模式:UnloadOnIdle", a)
InBlock.gif        
Return unloadOnIdleValue
ExpandedSubBlockEnd.gif    
End Function

ExpandedBlockEnd.gif
End Class

操作磁盘的功能类

None.gif Imports  System.IO
None.gif
Imports  System.IO.Compression
None.gif
None.gif
' 该类是将工作流实例保存到磁盘、从磁盘上加载的实体操作类
None.gif

ExpandedBlockStart.gifContractedBlock.gif
Public   Class 磁盘文件操作 Class 磁盘文件操作
InBlock.gif
InBlock.gif    
Shared 流 As FileStream = Nothing
InBlock.gif    
Shared 文件名 As String = Nothing
InBlock.gif
InBlock.gif
InBlock.gif    
'保存activity实例状态到文件,
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Public Shared Sub 保存()Sub 保存(ByVal rootActivity As Activity, ByVal id As Guid, ByVal unlock As Boolean)
InBlock.gif
InBlock.gif        
'unlock参数,是用来判断锁定的,本例中没用
InBlock.gif

InBlock.gif        文件名 
= id.ToString() '以当前工作流的实例ID为文件名
InBlock.gif

InBlock.gif        
Try
InBlock.gif            
If File.Exists(文件名) Then File.Delete(文件名) '如果存在该文件,就删除
InBlock.gif

InBlock.gif            流 
= New FileStream(文件名, FileMode.CreateNew, FileAccess.Write, FileShare.None) '新建流
InBlock.gif

InBlock.gif            rootActivity.Save(流) 
'将工作流实例写入流
InBlock.gif

InBlock.gif        
Finally
InBlock.gif            
If Not 流 Is Nothing Then
InBlock.gif                流.Close()
InBlock.gif            
End If
InBlock.gif        
End Try
InBlock.gif
InBlock.gif        test.持久化(
"磁盘文件操作.保存""保存完成:" + 文件名)
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
InBlock.gif    
'按实例ID从文件解串实例状态
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Public Shared Function 加载()Function 加载(ByVal id As Guid, ByVal outerActivity As Activity) As Object
InBlock.gif        文件名 
= id.ToString()
InBlock.gif
InBlock.gif        
Dim obj As Object = Nothing
InBlock.gif        
Try
InBlock.gif            流 
= New FileStream(文件名, FileMode.Open, FileAccess.Read, FileShare.Read) '从磁盘新建流
InBlock.gif
            流.Seek(0, SeekOrigin.Begin) '从磁盘载入流
InBlock.gif
            obj = Activity.Load(流, outerActivity)
InBlock.gif
InBlock.gif            test.持久化(
"磁盘文件操作.加载""加载完成:" + 文件名)
InBlock.gif
InBlock.gif            
Return obj
InBlock.gif        
Finally
InBlock.gif            流.Close()
InBlock.gif        
End Try
InBlock.gif
InBlock.gif
ExpandedSubBlockEnd.gif    
End Function

InBlock.gif
InBlock.gif    
'该段代码用于实现对磁盘文件的解锁,如果上面提供了对磁盘文件的锁定操作
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Public Shared Sub Unlock()Sub Unlock(ByVal id As Guid)
InBlock.gif        
Try
InBlock.gif            文件名 
= id.ToString()
InBlock.gif            流 
= New FileStream(文件名, FileMode.Open)
InBlock.gif            File.SetAttributes(文件名, FileAttributes.Normal)
InBlock.gif        
Finally
InBlock.gif            流.Close()
InBlock.gif        
End Try
InBlock.gif
InBlock.gif        test.持久化(
"磁盘文件操作.Unlock""解锁完成:" + 文件名)
InBlock.gif
ExpandedSubBlockEnd.gif    
End Sub

ExpandedBlockEnd.gif
End Class

None.gif

然后象加载 SqlWorkflowPersistenceService 类一样使用就可以了

None.gif Dim  引擎  As  WorkflowRuntime  =   New  WorkflowRuntime()
None.gif
Dim  自定义PS  As   New  自定义Persistence服务( True ' 为真时,引擎自动对进入idle模式的实例,调用Unload方法,
None.gif
引擎.AddService(自定义PS)
None.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值