2014-08-27 12 views
7

Bietet Windows Workflow Foundation eine Möglichkeit, Aktivitäten für Zwecke wie Protokollierung abzufangen oder zu dekorieren? Zum Beispiel um Protokolle für jeden Aktivitätseintrag und -ausgangspunkt zu erstellen (idealerweise einschließlich des Aktivitätsnamens), ohne den gesamten vorhandenen Projektcode zu ändern.Aktivitäten im Windows-Workflow abfangen/dekorieren

Zum Beispiel habe ich einen Workflow mit einer einzigen Aktivität, die "Hallo Welt" druckt. Ohne Änderungen an der XAML-Datei möchte ich den Ein- und Ausgang der Aktivität erfassen. Ich möchte "Hello World Activity" eingeben, bevor Sie die Aktivität eingeben und nachdem die Aktivität "Hello World" gedruckt hat, möchte ich "Completed Hello World Activity" drucken.

Bietet Windows Workflow einen Mechanismus zum Einhängen in den Ein- und Ausstieg einer Aktivität?


@ Richard210363 bereits zu den Kommentaren hinzugefügt, dass diese Funktion von Windows Workflow Foundation unterstützt wird - bitte können die Benutzer, die gewählt haben diese Frage prüfen, die in der Nähe ihrer Entscheidung Umkehrung als die Frage eindeutig eine sehr spezifische Antwort mit der hat Rahmen in Frage?

+0

nicht sicher über das Windows Workflow-Framework, aber AOP wird nicht sofort mit .net unterstützt. Sie müssen in MS Unity oder PostSharp usw. schauen, aber ich bezweifle, dass es eine schlüsselfertige Lösung sein wird und Arbeit erfordert (Hinzufügen von Attributen, wenn Sie Postsharp verwenden oder Codierungsmethoden über andere Lösungen) – Harrison

+0

Angenommen, ich habe einen Workflow xaml mit eine Aktivität, die "Hallo Welt" druckt. Jetzt, ohne die XAML-Datei zu ändern, möchte ich vor dem Einstieg in die Aktivität "Hello World Activity eingeben" drucken. Nach dem Druck von "Hello World" sollte ich "Completed Hello World Activity" drucken können. Grundsätzlich löst AOP diesen Anwendungsfall. – thangamanikasi

+2

Sehen Sie sich die Workflow TrackingParticipant-Klasse an. Sie hängen dies vor dem Ausführen an einen Workflow an. _workflowApplication.Extensions.Add (TrackingParticipant); Es wirkt auf alle Aktivitäten im Workflow ähnlich wie AOP im Umfang. Es gibt Informationen über den Eintritt und den Ausgang von Aktivitäten aus. Sie sollten von TrackingParticipant erben und die Track-Methode überschreiben: protected override void Track (TrackingRecord-Datensatz, TimeSpan-Timeout). Dann trage TrackingRecord auf ActivityStateRecord. Der Name der Aktivität lautet ActivityStateRecord..Activity.Name – Richard210363

Antwort

3

Werfen Sie einen Blick auf die Workflow TrackingParticipant-Klasse.

Es wirkt sich auf alle Aktivitäten im Workflow ähnlich wie AOP im Bereich.

Es gibt Informationen über die Eingabe und den Ausgang von Aktivitäten aus.

Erstellen Sie eine Klasse, die von TrackingParticipant erbt und die Track-Methode überschreiben:

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

Dann Ihre Tracking-Klasse an den Workflow an, bevor es ausgeführt wird.

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

Sie können TrackingRecord auch in WorkflowInstanceRecord umwandeln. ActivityStateRecord und WorkflowInstanceRecord liefern eine Vielzahl von Informationen über den Workflow und seine Aktivitäten.

+0

Ihre Lösung funktioniert wie erwartet. Danke vielmals. Ich habe unten den vollständigen Quellcode veröffentlicht, der alle Arbeitsabläufe und Aktivitäten verfolgt. – thangamanikasi

+0

Sehr erfreut, dass Sie es zur Arbeit gebracht haben. Könnten Sie mich als die Antwort markieren, wenn Sie können? – Richard210363

5

Ich schrieb den folgenden Code, der in der Lage ist, alle Arbeitsabläufe und Aktivitäten zu verfolgen.

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