Skip to main content
Skip table of contents

Aktionen von internen Workflows

Der Shop definiert in seinen Bibliotheken eine Reihe Aktionen, die als Schritte eines Workflows verwendet werden können. Alle diese Aktionen sind unter Centauri.Shop.Workflow implementiert. Darunter befinden sich Namespaces, die die Aktionen in Themengebiete unterteilen, z.B. Centauri.Shop.Workflow.FTP, Centauri.Shop.Workflow.HTTP, etc.

Alle Aktionen sind von der Basisklasse Centauri.Shop.Workflow.Action abgeleitet und überschreibt die Work() Methode, in der die eigentliche Arbeit gemacht wird.

Nach Ausführung der Work() Methode setzt die Aktion die Successful Eigenschaft, mit der aufrufende Module den Erfolg kontrollieren können. Die Aktion definiert selbst, was eine erfolgreiche Ausführung ist. Beispielsweise setzt die Centauri.Shop.Workflow.Filesystem.Exists Aktion die Successful Eigenschaft, wenn das gesuchte File im Dateisystem vorhanden ist.

Damit die Aktion arbeiten kann, wird ihr ein Context zugeordnet. In dieser Instanz der Klasse Centauri.Shop.Workflow.Context sind Variablen gespeichert, mit denen ein Workflow gerade abläuft. Es können mehrere Instanzen eines Workflows ablaufen, wenn mehrere Context im System vorhanden sind.

Jede Aktion kann diese Variablen abfragen, um seine Arbeit sinnvoll verrichten zu können. Die Centauri.Shop.Workflow.Filesystem.Exists fragt z.B. die Variable folder und filename ab. Aus folder holt die Aktion das Verzeichnis in dem das Vorhandensein einer Datei kontrolliert werden soll. Aus filename holt die Aktion den Dateinamen der kontrolliert werden soll. Dabei kann der filename eine Suchmaske sein, z.B. *.xlsx

Eine Aktion darf Standardwerte annehmen, wenn die Variablen im Context nicht vorhanden sind oder diese Standardwerte aus einer Konfigurationsvariable in der web.config lesen.

Jede Aktion kann die Variablen im Context verändern. Diese Änderung wird dann im Context gespeichert und wird so an den nächsten Schritt im Workflow weitergegeben. Die Centauri.Shop.Workflow.Filesystem.Exists legt z.B. in der Variable filename den Namen der gefundenen Datei ab. Das ist hilfreich, wenn zuvor eine Suchmaske wie z.B. *.xlsx in der Variable gespeichert war. Danach steht dann z.B. file1.xlsx drin.

Nicht nur die Aktionen können die Variablen im Context ändern. Die Workflow Schritte, die die Aktionen aufrufen können ebenfalls Werte für die Variablen speichern. Diese werden vor Aufruf der Aktion in den Context gepatched und überschreiben die Werte der Variablen.

Zugriff der Aktion auf den Context

Damit eine Aktion auf Variablen zugreifen kann, implementiert die Basisklasse mit der Eigenschaft Context einen Verweis auf den Context, mit dem die Aktion aufgerufen werden kann. Der Context wiederum besitzt die Zugriffsmethoden

CODE
DataField( variablenname )

zur Abfrage einer Variable als String und die Zugriffsmethode

CODE
DataField( variablenname, neuerwert )

zum Schreiben eines neuen Wertes in die Variable des Context.

Alternativ kann über DataXml auch der gesamte Context als XmlDocument ausgelesen werden.

Protokollierung der Arbeit einer Aktion

Die Aktion kann innerhalb der Implementierung der Work() Methode die Methode

CODE
Log( text )

aufrufen, um diese in die Historie des Workflows zu schreiben. Zeitgleich wird der Text auch ins Shop-Protokoll geschrieben (mit Centauri.Shop.State.Log()).

Beispielimplementierung einer Aktion

Untenstehend als Modell die Implementierung der Exists() Aktion, mit der ein Workflow prüfen kann, ob z.B. eine Datei in einem Verzeichnis zur Verfügung steht und überhaupt erst mit der Arbeit begonnen werden muss.

CODE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Centauri.Shop.Workflows.Filesystem
{
    public class Exists: Action
    {
        public Exists(Context context) : base(context)
        {

        }

        protected string Filename
        {
            get
            {
                return Context.DataField("filename");
            }

            set
            {
                Context.DataField("filename", value);
            }
        }

        protected string Folder
        {
            get
            {
                return Context.DataField("folder");
            }
        }


        public override bool Work()
        {
            try
            {
                if (this.Filename.Contains("*"))
                {
                    var files = new System.IO.DirectoryInfo(this.Folder).GetFiles(this.Filename);
                    if (files.Length == 0) return false;

                    this.Filename = files[0].Name;
                    Log( this.Filename + " gefunden!");
                }

                successful = System.IO.File.Exists(System.IO.Path.Combine(this.Folder, this.Filename));
                return successful;
            }
            catch (Exception ex)
            {
                Log("Filesystem: " + ex.ToString());
                return false;
            }

            return false;
        }
    }
}

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.