2016-06-11 56 views
0

我们正在使用Workflow Foundation 4在我们的应用程序中实现自定义逻辑。一件特别的事情是,我们正在使用与外部系统中的资源相关联的自定义类型的变量。如何通知Workflow Foundation 4中的变量超出范围?

当这样一个变量不再在工作流中使用时,我想在外部系统中处理相应的资源。

我的自定义主机如何在运行时通知我的变量超出范围和/或被丢弃。我是否需要我的变量对象来自特定的类或接口?我是否需要在工作流实例中注入特定的扩展?

回答

0

一种方法可以是实现自定义TrackingParticipant。这可以用于监视活动状态何时更改为关闭状态。当它关闭时,您可以检查参数以查看是否有任何您想要清理的资源。

它可能是这个样子:

public interface IResource 
{ 
} 

public class MyTrackingParticipant : TrackingParticipant 
{ 
    private readonly MyResourceManager resourceManager; 

    public MyTrackingParticipant(MyResourceManager resourceManager) 
    { 
     this.resourceManager = resourceManager; 
    } 

    protected override void Track(TrackingRecord record, TimeSpan timeout) 
    { 
     var activityStateRecord = record as ActivityStateRecord; 
     if (activityStateRecord != null && activityStateRecord.State == ActivityStates.Closed) 
     { 
      // Scan arguments to see if resources should be deallocated from resource manager. 
      foreach (var keyValuePair in activityStateRecord.Arguments) 
      { 
       // If the argument is of a resource type... 
       var resource = keyValuePair.Value as IResource; 
       if (resource != null) 
        this.resourceManager.DeallocateResource(resource); 
      } 
     } 
    } 
} 

而且使用自定义跟踪参与者,就像任何其他的WF扩展:

var resourceManager = new MyResourceManager(); 
var wfResourceTrackingParticipant = new MyTrackingParticipant(resourceManager); 
var workflow1 = new Workflow1(); 
var workflowApp = new WorkflowApplication(workflow1); 
workflowApp.Extensions.Add(wfResourceTrackingParticipant); 
+0

感谢您的反馈。但是,我在*自动*通知之后,因为我使用的变量是否不再需要。我不喜欢WF的作者用一个明确的“CleanupActivity”来分发工作流。 –

+0

考虑一下之后,实现一个自定义跟踪参与者可能是一条路。我更新了我的答案以反映这种方法。 – ajawad987

+0

太棒了,这符合我所寻找的,谢谢。我会尝试并让你知道。 –