2012-01-07 79 views
3

我正在构建一个使用棱镜的WPF应用程序,我想使用工作流基础(本地和服务)。从工作流活动发布事件

有没有人对构建使用EventAggretator调用的工作流活动有所了解,然后让工作流发布事件作为响应?我正在考虑构建一个允许活动发布一对多事件的实现,这对于工作流程来说是一个很好的场景吗?

+0

它们当然可以用EventAggregator调用,但Windows Workflow Foundation不是为您提供事件系统而构建的。你能否更具体地探讨你真的想从WF中走出来?就像你想要的流程的Visio图表一样? – 2012-06-28 22:06:51

回答

2

您可以使用事件聚合器实现的一种方法是将其作为您的工作流活动的扩展,如下所示。在您的WorkflowApplication/WorkflowInvoker中,您可以注册一个事件聚合器实例,以便您的活动可以引发事件。我还没有在我的应用中使用过事件聚合器,所以可能会出现一些怪癖。

自定义活动,需要一个事件聚集,并使用在其执行方法:

namespace SampleWorkflowAppOne 
{ 
    using System.Activities; 
    using Microsoft.Practices.Prism.Events; 

    public class PurchaseOrderInventoryCheckActivity : NativeActivity 
    { 
     protected override void CacheMetadata(NativeActivityMetadata metadata) 
     { 
      metadata.RequireExtension<IEventAggregator>(); 
     } 

     protected override void Execute(NativeActivityContext context) 
     { 
      var eventAggregator = context.GetExtension<IEventAggregator>(); 
      var somethingHappenedEvent = eventAggregator.GetEvent<MyActivityEvent>(); 
      var myEventInfo = new MyEventInfo() { SomeNumber = 5 }; 
      somethingHappenedEvent.Publish(myEventInfo); 
     } 
    } 

    public class MyActivityEvent : CompositePresentationEvent<MyEventInfo> 
    { 
    } 

    public class MyEventInfo 
    { 
     public int SomeNumber { get; set; } 
    } 
} 

注册使用的事件聚合比如在你的活动:

using System; 
using System.Linq; 
using System.Activities; 
using System.Activities.Statements; 

namespace SampleWorkflowAppOne 
{ 
    using Microsoft.Practices.Prism.Events; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var purchaseOrderValidationWorkflow = new PurchaseOrderValidationWorkflow(); 
      var eventAggregator = new EventAggregator(); 
      var wfInvoker = new WorkflowInvoker(purchaseOrderValidationWorkflow); 
      wfInvoker.Extensions.Add(eventAggregator); 
      wfInvoker.Invoke(); 
     } 
    } 
} 

希望有所帮助。

编辑:我发现这个视频,显示建立一个事件驱动+长时间运行的工作流程,也可能有一些帮助。我还没有看到它:http://channel9.msdn.com/Events/Build/BUILD2011/TOOL-801T