活动 - 工作流实例扩展一对一关系

时间:2011-04-21 06:30:29

标签: c# .net workflow-foundation-4

我正在尝试实现一个WF4活动扩展,它可以处理一些长时间运行的数据处理,并不时地将信息发送回“母亲”活动。

我实现了这个版本,但是如果我在并行活动上下文中使用此活动,则会遇到问题。从下面的代码中可以看出,活动正在创建一个书签,并在调用MyActivityExtension对象之后。 我希望MyActivity类的每个实例都有一个不同的MyActivityExtension实例来与之通信。如果在一个工作流定义中使用此类型的两个活动,则一切正常,并且对扩展类的调用是针对不同的对象,但是如果一个活动开始执行而另一个活动空闲,则第二个活动使用相同的扩展实例,如闲人的。

下面我添加了一个简化的代码示例。知道如何在活动实例和活动扩展实例之间建立一对一的关系吗?

提前谢谢你, 亚历

MyActivity代码:

    protected override void Execute(NativeActivityContext context)
    {
        //Some data processing....

        //Obtain the activity extension
        MyActivityExtension extension = context.GetExtension<MyActivityExtension >();


        string bookmarkName = "MyActivity_" + Guid.NewGuid().ToString();
        var bookmark = context.CreateBookmark(bookmarkName, BookmarkResumed);

        extension.ProcessData(bookmarkName);
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);
        metadata.AddDefaultExtensionProvider<MyActivityExtension >(() => new MyActivityExtension ());
    }

 private void BookmarkResumed(NativeActivityContext context, Bookmark bookmark, object value)
    {
       //some data retrieving operations
    }

MyActivityExtension代码:

public class MyActivityExtension : IWorkflowInstanceExtension
{
    private WorkflowInstanceProxy instance;
    private Guid id;

    public MyActivityExtension()
    {
         id = Guid.NewGuid();
    }

    internal void ProcessData(string bookmarkName)
    {
        Console.WriteLine("My activity extension Id: " + id.ToString());

        //Some data processing
    }

    public IEnumerable<object> GetAdditionalExtensions()
    {
        return null;
    }

    public void SetInstance(WorkflowInstanceProxy instance)
    {
        this.instance = instance;
    }
}

1 个答案:

答案 0 :(得分:1)

IWorkflowInstanceExtension有助于对一个工作流关系进行一次扩展,但您发现的每个活动将共享相同的扩展。没有开箱即用的方法为每个活动创建新的扩展。我要做的是将扩展名更改为某种扩展工厂,并使用Create()函数返回一个新对象。

所以你的代码看起来像这样:

   protected override void Execute(NativeActivityContext context)
    {
        //Some data processing....

        //Obtain the activity extension
        MyActivityExtensionFactory extensionFactory = context.GetExtension<MyActivityExtensionFactory >();
        MyActivityExtension extension = extensionFactory.Create();

        string bookmarkName = "MyActivity_" + Guid.NewGuid().ToString();
        var bookmark = context.CreateBookmark(bookmarkName, BookmarkResumed);

        extension.ProcessData(bookmarkName);
    }