我正在编写一个自定义 Windows Workflow Foundation 活动,它异步启动一些进程,然后在异步事件到达时唤醒。
我发现的所有示例(例如Kirk Evans的示例)都涉及自定义工作流服务,该服务完成大部分工作,然后将事件发布到活动创建的队列。主要原因似乎是发布事件的唯一方法[在非 WF 线程中工作]是 WorkflowInstance.EnqueueItem,并且活动无权访问工作流实例,因此它们无法发布事件(来自我接收异步操作结果的非 WF 线程)。
我不喜欢这种设计,因为这会将功能分成两部分,并且需要在添加新活动类型时向主机添加服务。丑陋。
所以我编写了以下通用服务,我从活动的异步事件处理程序中调用它,并且可以被各种异步活动重用(省略错误处理):
class WorkflowEnqueuerService : WorkflowRuntimeService
{
public void EnqueueItem(Guid workflowInstanceId, IComparable queueId, object item)
{
this.Runtime.GetWorkflow(workflowInstanceId).EnqueueItem(queueId, item, null, null);
}
}
现在在活动代码中,我可以获得并存储对此服务的引用,启动我的异步操作,当它完成时,使用此服务将事件发布到我的队列。这样做的好处 - 我将所有特定于活动的代码保留在活动中,并且我不必为每种活动类型添加新服务。
但是看到官方和互联网示例这样做会专门提供不可重用的服务,我想检查这种方法是否可以,或者我在这里制造了一些问题?