2014-08-27 4 views
7

Предоставляет ли Windows Workflow Foundation возможность перехвата или оформления действий для таких целей, как ведение журнала? Например, для создания журналов для каждой записи активности и выхода (в идеале, включая имя активности) без изменения всего существующего кода проекта.Перехват/оформление действий в рабочем процессе Windows

Например, у меня есть рабочий процесс с одним действием, которое печатает «Hello world». Не внося изменений в файл XAML, я хотел бы зафиксировать запись и выход из нее. Я хотел бы напечатать «Entering Hello World Activity» перед входом в эту активность, и после того, как активность напечатала «Hello World», я бы хотел напечатать «Completed Hello World Activity».

Предоставляет ли Windows Workflow механизм для входа и выхода из активности?


@ Richard210363 уже добавил к комментариям, что эта функция поддерживается Windows Workflow Foundation, - пожалуйста, может ли пользователи, которые решили закрыть этот вопрос рассмотреть реверсирования своего решения, как вопрос, очевидно, имеет очень конкретный ответ, используя рассматриваемая структура?

+0

не уверен в среде Windows Workflow, но AOP не поддерживается из-за-коробки с .net. вам нужно будет изучить MS Unity или PostSharp и т. д., но я сомневаюсь, что это будет готовое решение и потребует работы (добавление атрибутов, если вы используете postharp, или методы кодирования с помощью других решений) – Harrison

+0

Скажем, у меня есть рабочий процесс xaml с одно действие, которое печатает «Hello world». Теперь, не изменяя файл XAML, я хочу напечатать «Enter Hello World Activity» перед тем, как войти в эту активность. После печати «Hello World» я должен иметь возможность распечатать «Завершена Hello World Activity». В основном АОП решает этот вариант использования. – thangamanikasi

+2

Посмотрите на рабочий класс TrackingParticipant. Перед запуском вы присоединяете это к рабочему процессу. _workflowApplication.Extensions.Add (TrackingParticipant); Он действует во всех действиях в рабочем процессе, аналогичном AOP по объему. Он испускает информацию о входе и выходе деятельности. Вы должны наследовать от TrackingParticipant и переопределить метод Track: protected override void Track (TrackingRecord record, TimeSpan timeout). Затем отмените TrackingRecord на ActivityStateRecord. Именем активности является ActivityStateRecord..Activity.Name – Richard210363

ответ

3

Посмотрите на рабочий процесс TrackingParticipant class.

Он действует во всех действиях в рабочем процессе, аналогичных AOP в области.

Он испускает информацию о входе и выходе деятельности.

Создать класс, который наследует от TrackingParticipant и переопределить метод Track:

protected override void Track(TrackingRecord record, TimeSpan timeout) 
    { 
     ActivityStateRecord activityStateRecord = record as ActivityStateRecord; 
     string CurrentActivityName = activityStateRecord.Activity.Name, 
    } 

Затем присоедините свой класс отслеживания рабочего процесса, прежде чем он работает.

_workflowApplication.Extensions.Add(_yourWorkFlowTrackingClass); 
_workflowApplication.Run(); 

Вы также можете отнести TrackingRecord в WorkflowInstanceRecord. Между ними ActivityStateRecord и WorkflowInstanceRecord предоставляют много информации о рабочем процессе и его действиях.

+0

Ваше решение работает должным образом. Благодаря тонну. Я разместил ниже полный исходный код, который отслеживает все рабочие процессы и действия. – thangamanikasi

+0

Очень рад, что вы получили его на работу. Не могли бы вы пометить меня как ответ, если сможете. – Richard210363

5

Я написал следующий код, который способен отслеживать все рабочие процессы и действия.

public class ActivityTracker : TrackingParticipant 
{ 
    protected override void Track(TrackingRecord record, TimeSpan timeout) 
    {    
     if (record != null) 
     { 
      if (record is WorkflowInstanceRecord) 
      { 
       WorkflowInstanceRecord instanceRecord = record as WorkflowInstanceRecord; 
       Console.WriteLine("Workflow Record: Instance: {0} - State: {1} - Definition Identity: {2}", instanceRecord.ActivityDefinitionId, instanceRecord.State, instanceRecord.WorkflowDefinitionIdentity); 
      } 
      else if (record is ActivityStateRecord) 
      { 
       ActivityStateRecord instanceRecord = record as ActivityStateRecord; 
       Console.WriteLine("Activity Record: Name: {0} - State: {1}", instanceRecord.Activity.Name, instanceRecord.State); 
      } 
     }    
    } 
}