2017-05-10 3 views
0

Ich frage mich, ob es ein etabliertes Muster gibt, um den Fluss zu steuern, den meine Anwendung haben wird.Invertierte Pipeline/Verantwortungskette Muster

Einfach gesagt, es so etwas wie das angenommen hat, sein:

  • Benutzer liefert eine Datei
  • Datei verarbeitet wird
  • Benutzer erhält eine bearbeitete Datei

wird es mehrere sein Verarbeitungsschritte, sagen wir PreprocessingOne, PreprocessingTwo, PreprocessingThree und FinalProcessing.

Natürlich kontrollieren wir nicht die Dateien, die der Benutzer zur Verfügung stellt - sie benötigen eine unterschiedliche Anzahl von Vorverarbeitungsschritten.

Da sich meine Message-Handler-Dienste in separaten APIs befinden, möchte ich sie aus Gründen der Leistung nicht aufrufen, nur um "noch nicht verarbeiten" oder "muss nicht verarbeitet werden" zurückzugeben.

Gleichermaßen möchte ich die hochgeladene Datei nicht zwischen den Diensten übergeben.

Idealerweise möchte ich den Fluss für eine Datei dynamisch gestalten, indem ich den Inhalt auswerte und nur diejenigen der sinnvollen Message-Handler einfüge.

Ich sage 'Inverted' Pipeline, denn anstatt von A nach Z zu gehen, möchte ich lieber prüfen, welche Stufen ich von Z aus brauche und nur die letzten einfügen.

Also, wenn die hochgeladene Datei für FinalProcessing sofort qualifiziert, wäre der Fluss nur ein Element.

Wenn die Datei aus PreprocessingTwo dann würde gehen müssen sein der Fluss PreprocessingTwo>PreprocessingThree>FinalProcessing

Also, ich dachte, dass ich so etwas umsetzen könnte, aber ich bin mir nicht sicher über die Details.

public interface IMessageHandler 
    { 
    void Process(IFile file); 
    } 


public interface IContentEvaluator 
{ 
    IList<IMessageHandler> PrepareWorkflow(IFile file); 
} 

public interface IPipelineExecutor 
{ 
     void ExecuteWorkflow(IList<IMessageHandler> workflow, IFile file); 
    } 

Und dann in der Anwendung

public void Start(IFile newFile) 
{ 
    var contentEvaluator = new ContentEvaluator(this.availableHandlers); // would be DI 
    var workflow = contentEvaluator.PrepareWorkflow(newFile); 
    this.executor.ExecuteWorkflow(workflow, newFile); 

} 

Könnten Sie bitte beraten, empfehlen lesen einige Ansatz oder weiter?

Antwort

2

Sie können Strategy verwenden Muster: ... wählt einen Algorithmus zur Laufzeit ...
Aber wenn Sie zu viele Kombinationen des Flusses als die Anzahl der Strategien, die implementiert werden müssen, wird zunehmen und Lösung kann komplex sein.

kann ein anderen Ansatz SEDA zu verwenden: ... zersetzt ich eine komplexe, ereignisgesteuerte Anwendung in einen Satz von Stufen von Warteschlangen verbunden ...
PreprocessingOne, PreprocessingTwo, PreprocessingThree FinalProcessing und die Stufen sind, und Ströme definiert werden, indem ausgehende Nachrichten an verschiedene Warteschlangen geleitet werden.

0

Ist das ein decorator pattern

Definition

Bringen Sie zusätzliche Aufgaben zu einem dynamisch-Objekt. Dekoratoren bieten eine flexible Alternative zur Unterklasse zur Erweiterung der Funktionalität .