2012-01-07 2 views
3

Я создаю приложение WPF с использованием призмы, и я хотел бы использовать основание рабочего процесса (как локально, так и из службы).Публикация событий из рабочего процесса

У кого-нибудь есть идеи по созданию рабочих процессов, вызванных с помощью EventAggretator, а затем, чтобы рабочий процесс публиковал события в ответ? Я рассматриваю возможность создания реализации, которая позволила бы активности публиковать один-много событий, является ли это хорошим сценарием для рабочего процесса?

+0

Они могут быть вызваны с помощью EventAggregator, но Windows Workflow Foundation не создан для предоставления вам системы событий. Можете ли вы дать более конкретное объяснение того, что вы действительно пытаетесь выбраться из WF? Как диаграмма Visio потока, который вы хотите? –

ответ

2

Один из способов, который вы можете реализовать с помощью агрегатора событий, - это потребовать его как расширение для ваших действий рабочего процесса, например, следующее. В вашем WorkflowApplication/WorkflowInvoker вы можете зарегистрировать экземпляр агрегатора событий, чтобы ваши действия могли поднять события. Я не использовал агрегатор событий (пока) в моих приложениях, поэтому могут возникнуть некоторые причуды.

Пользовательские активность, что требует агрегатор событий и использует его в Execute методе:

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(); 
     } 
    } 
} 

Надежда, что помогает.

EDIT: Я нашел это видео, в котором показано создание события с длинным рабочим циклом, который может также помочь. Я еще не смотрел его: http://channel9.msdn.com/Events/Build/BUILD2011/TOOL-801T

Смежные вопросы