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

C# 活动-工作流实例扩展一对一关系,c#,.net,workflow-foundation-4,C#,.net,Workflow Foundation 4,我正在尝试实现一个WF4活动扩展,它可以处理一些长时间运行的数据处理,并不时地将信息发送回“母亲”活动 我实现了这个版本,但是如果我在并行活动上下文中使用这个活动,我会遇到问题。从下面的代码可以看出,活动正在创建书签,并在调用MyActivityExtension对象之后。 我希望MyActivity类的每个实例都有一个不同的MyActivityExtension实例进行通信。如果在一个工作流定义中连续使用两个此类活动,则一切正常,并且对扩展类的调用针对不同的对象,但如果一个活动开始执行,而另一

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

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

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

提前谢谢大家,, 亚历克斯

我的活动代码:

    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
    }
protected override void Execute(NativeActivityContext上下文)
{
//一些数据处理。。。。
//获取活动扩展名
MyActivityExtension=context.GetExtension();
字符串bookmarkName=“MyActivity_389;”+Guid.NewGuid().ToString();
var bookmark=context.CreateBookmark(bookmarkName,bookmark);
extension.ProcessData(书签名称);
}
受保护的覆盖无效缓存元数据(NativeActivityMetadata)
{
base.CacheMetadata(元数据);
AddDefaultExtensionProvider(()=>newMyActivityExtension());
}
private void Bookmark已恢复(NativeActivityContext上下文、书签书签、对象值)
{
//一些数据检索操作
}
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;
    }
}
公共类MyActivityExtension:IWorkflowInstanceExtension
{
私有WorkflowInstanceProxy实例;
私有Guid id;
公共MyActivityExtension()
{
id=Guid.NewGuid();
}
内部void ProcessData(字符串书签名称)
{
WriteLine(“我的活动扩展Id:+Id.ToString());
//一些数据处理
}
公共IEnumerable GetAdditionalExtensions()
{
返回null;
}
公共void SetInstance(WorkflowInstanceProxy实例)
{
this.instance=instance;
}
}

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);
    }
protected override void Execute(NativeActivityContext上下文)
{
//一些数据处理。。。。
//获取活动扩展名
MyActivityExtensionFactory extensionFactory=context.GetExtension();
MyActivityExtension=extensionFactory.Create();
字符串bookmarkName=“MyActivity_389;”+Guid.NewGuid().ToString();
var bookmark=context.CreateBookmark(bookmarkName,bookmark);
extension.ProcessData(书签名称);
}

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);
    }
protected override void Execute(NativeActivityContext上下文)
{
//一些数据处理。。。。
//获取活动扩展名
MyActivityExtensionFactory extensionFactory=context.GetExtension();
MyActivityExtension=extensionFactory.Create();
字符串bookmarkName=“MyActivity_389;”+Guid.NewGuid().ToString();
var bookmark=context.CreateBookmark(bookmarkName,bookmark);
extension.ProcessData(书签名称);
}

好主意,莫里斯。我实现了一个扩展工厂并解决了这个问题。非常感谢。好主意,莫里斯。我实现了一个扩展工厂并解决了这个问题。非常感谢。