活动-工作流实例扩展一对一关系
我正在尝试实现一个 WF4 活动扩展,它可以处理一些长时间运行的数据处理,并时不时地将信息发送回“母亲”活动。
我实现了这个版本,但如果我在并行活动上下文中使用此活动,我会遇到问题。从下面的代码可以看出,该活动正在创建书签,然后调用 MyActivityExtension 对象。 我希望 MyActivity 类的每个实例都有一个不同的 MyActivityExtension 实例进行通信。如果在一个工作流定义中顺序使用这种类型的两个活动,则一切正常,并且对扩展类的调用是对不同的对象进行的,但如果一个活动开始执行,而另一个活动空闲,则第二个活动使用相同的扩展实例,例如闲置的那个。
下面我添加了代码的简化示例。知道如何在活动实例和活动扩展实例之间强加一对一的关系吗?
先感谢您, Alex
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;
}
}
I am trying to implement a WF4 activity extension which to handle some long running data processing and to send information back to the "mother" activity from time to time.
I implemented a version of this but I have issues with it if I am using this activity in a parallel activity context. As it can be seen from the code below, the activity is creating a bookmark and after it makes a call to the MyActivityExtension object.
I want that every instance of the MyActivity class to have a different instance of MyActivityExtension to communicate with. If two activities of this type are used sequentaly in one workflow definition everything works OK, and the calls to the extension class are made to different objects, but if one activity starts execution while another one is idled the second activity use the same extension instance like the idled one.
Below I have added a simplified sample of my code. Any idea how I can impose a one-to-one relation between activity instances and activity extension instances?
Thank you in advance,
Alex
MyActivity code:
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 code:
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;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
IWorkflowInstanceExtension 有助于实现一种工作流关系的一对一扩展,但正如您发现的那样,每个活动都将共享相同的扩展。没有现成的方法可以为每个活动创建新的扩展。我要做的是将扩展更改为某种扩展工厂,并使用返回新对象的 Create() 函数。
所以你的代码看起来像这样:
The IWorkflowInstanceExtension helps with a one extension to one workflow relation but each activity, as you discovered will share the same extension. There is no out of the box way to create a new extension for each activity. What I would do is change the extension into some sort of extension factory with a Create() function that returns a new object.
So your code would look something like this: