2012-01-07 74 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