18. Jan 2021
Lesedauer 6 Min.
Andere arbeiten lassen
Open-Source-Projekte für .NET: Elsa Workflows
Mit Elsa lässt sich komplexe Geschäftslogik einfach visualisieren und bearbeiten.

Im .NET-Umfeld hat sich in den vergangenen Jahren eine gesunde Open-Source-Community entwickelt, die durchaus interessante und sinnvolle Projekte liefert. Leider werden diese angesichts der deutlich größeren und besser vermarkteten Open-Source-Lösungen aus dem Hause Microsoft häufig zu wenig beachtet. Dieser Artikel wirft einen genauen Blick auf das Projekt Elsa Workflows [1], kurz Elsa. Elsa ist ein Framework, um Arbeitsabläufe in .NET-Projekten zu bearbeiten und auszuführen. Dabei können diese Arbeitsabläufe – oder Workflows – durch Verknüpfung von Boxen in einem webbasierten Designer erstellt werden. Jede Box erhält Eingabeparameter und gibt als Ausgabe einen oder mehrere Werte zurück. Am Ende können die Workflows beliebig groß und komplex werden. Ebenso lassen sich Arbeitsabläufe mithilfe von C#-Code erstellen.
Worum geht’s?
Beim Erweitern von Applikationen denken Entwickler häufig an Fabrikmuster oder Plug-ins – selten jedoch an die Automatisierung von Standardaufgaben über einen Workflow. Dabei ist Letzteres für Endanwender häufig wichtiger als das direkte Nutzen weiterer externer Funktionalitäten.Ein Arbeitsablauf kann im Prinzip beliebig komplex aufgebaut werden. Die Grundsteine finden sich im Regelfall in der bereitstellenden Anwendung. So können Ereignisse, die von der Software ausgelöst werden, sinnvolle Trigger darstellen. Eingabeparameter oder Ausgaben sind häufig auch stark an die Applikationsdomäne gebunden. Wer es generischer möchte, kann einen HTTP-Aktuator als Ziel eintragen. Dadurch lassen sich Dienste wie Zapier oder IFTTT zur weiteren Bearbeitung ansprechen.Interview mit Sipke Schoorstra, Entwickler von Elsa Workflows
In der Praxis
Während Elsa in vielen Aspekten versucht, ein würdiger Nachfolger für die Workflow Foundation zu sein, so ist die allgemeine Tendenz, eine doch deutlich modernere Alternative zu repräsentieren. Das fängt bereits bei der sehr gut gestalteten, ausführlichen Dokumentation an und zieht sich über die Installation bis hin zur Konfiguration und Verwendung. Wie in Bild 1 dargestellt, ist über die Homepage des Projekts ohne große Umwege weiteres Lernmaterial zu erreichen.
Die Homepage von Elsamacht es dem Besucher einfach, an Informationen zu kommen(Bild 1)
Autor
Es gibt zwei Modelle, um die Arbeitspläne auszuführen:
- In-process: Arbeitspläne werden innerhalb der Anwendung angestoßen und ausgeführt.
- Out-of-process: Hier werden die Arbeitspläne in einem externen Prozess verwaltet, der Interaktionen über HTTP und AMQP zulässt. Somit kann jede beliebige Applikation die Workflow-Engine von Elsa verwenden – und zwar unabhängig vom benutzten Technologie-Stack. Dies erlaubt auch Zugriff von Skriptsprachen wie etwa PHP oder Ruby.
Listing 1: Integration von Elsa in ASP.NET Core
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">ConfigureServices</span><span class="hljs-params">(</span></span><br/><span class="hljs-function"><span class="hljs-params"> IServiceCollection services)</span> </span><br/>{ <br/> services <br/> .AddElsa() <br/> .AddTimerActivities(); <br/>}
Zusätzlich ist es noch möglich, Elsa an dieser Stelle ausführlich zu konfigurieren. Zunächst sollte dafür das NuGet-Paket Elsa eingerichtet werden. Experten können anstelle der kombinierten Abhängigkeit auch mit Elsa.Core starten. Hierbei handelt es sich um Kernfunktionalitäten mit der geringsten Anzahl an Abhängigkeiten. Erweiterungen und Vorkonfigurationen wie zum Beispiel die Möglichkeit, AddTimerActivities() zu konfigurieren, sind hier noch nicht enthalten.Die Arbeitspläne selbst sind vollständig serialisierbar. Dies führt dazu, dass diese nicht nur in C# erstellt werden, sondern auch aus JSON-, XML- und anderen Dateien importiert werden können. Auch das Speichern auf der Festplatte oder in einer Datenbank ist problemlos möglich.Für ein direktes und unaufwendiges Bereitstellen von Workflows genügt es, das IWorkflow-Interface zu implementieren. In der Build()-Methode lässt sich daraufhin der Workflow über das Fluent-API eines IWorkflow-Objekts erstellen. In Listing 2 wird darüber ein wiederkehrender Workflow erzeugt, der alle fünf Sekunden angestoßen wird. Über JavaScriptExpression ist es möglich, einen String zur Laufzeit dynamisch auszuwerten. Hier kann durchaus auch komplexere Logik verwendet werden.
Listing 2: Definition eines wiederkehrenden Workflows
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">RecurringTaskWorkflow</span> : <span class="hljs-title">IWorkflow</span> <br/>{ <br/> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Build</span>(<span class="hljs-params">IWorkflowBuilder builder</span>) </span><br/><span class="hljs-function"> </span>{ <br/> builder <br/> .AsSingleton() <br/> .StartWith&lt;TimerEvent&gt;(x =&gt;<br/> x.TimeoutExpression = <span class="hljs-keyword">new</span><br/> LiteralExpression&lt;TimeSpan&gt;(<span class="hljs-string">"00:00:05"</span>)) <br/> .Then&lt;WriteLine&gt;(x =&gt; x.TextExpression = <br/> <span class="hljs-keyword">new</span> JavaScriptExpression&lt;<span class="hljs-keyword">string</span>&gt;(<br/> <span class="hljs-string">"'It’s now ${new Date()}. "</span><br/> + <span class="hljs-string">"Let’s do this thing!'"</span>)); <br/> } <br/>}
Um zeitgesteuerte Aktivitäten zu ermöglichen, muss vorab der entsprechende Service hinzugefügt werden. In Listing 1 wurde der hierzu notwendige Code bereits eingefügt.Der visuelle Designer wird über das NuGet-Paket Elsa.Dashboard zur Verfügung gestellt. Seine Installation ist genauso einfach wie bei Elsa selbst. Über die Erweiterungsmethode AddElsaDashboard() lassen sich die notwendigen Dienste konfigurieren. Zur optimalen Anzeige sollten statische Dateien vom ASP.NET-Core-Server ausgespielt werden. In Bild 2 ist die Standardansicht des Workflow-Editors dargestellt.

Erstelleneines Workflowsmit Elsas visuellem Designer(Bild 2)
Autor
Besonders beeindruckend ist die direkt nach der Installation vorhandene Auswahl von Szenarien, Auslösern und Optionen. Das Framework erfüllt so ziemlich alle Wünsche bereits ohne irgendwelche weiteren Konfigurationen oder Installationen. Man kann also direkt loslegen, ohne viel Zeit mit der grundlegenden Integration und Bereitstellung verbringen zu müssen.
„So ziemlich jedes Backend-System könntevon so etwas profitieren“
<span class="zitat-autor-name">Sipke Schoorstra: </span><br/>Ich erinnere mich immer noch lebhaft an meinen ersten Computer, den ich an Weihnachten bekommen habe: ein Nintendo Entertainment System. Beigefügt waren jede Menge Spiele, unter anderem Mario Bros, Zelda und The Battle of Olympus. Da wusste ich bereits, was ich mal werden will: Game Designer.
Einen Beitrag leisten
Im Vergleich zu den häufiger anzutreffenden MIT-lizenzierten Projekten ist Elsa aufgrund der gewählten BSD-3-Variante ein wenig restriktiver. Im Regelfall hat dies jedoch kaum spürbare Auswirkungen. So ließen sich mittlerweile an die 18 unterschiedliche Mitwirkende zu einem Pull Request (PR) hinreißen. Auch Bug Reports oder spezielle Feature Requests sind gerne gesehen. Um einen PR zu erstellen, sollte man sich zunächst mit dem Prozess vertraut machen.Hier wird auf den recht gebräuchlichen GitHub-Flow gesetzt. Im Unterschied zum Git-Flow zeichnet sich dieser durch sehr häufige Releases und möglichst geringen Overhead aus. Im Fall von Elsa startet die Entwicklung immer im Develop-Branch. Dieser sollte auch als Ziel für mögliche PRs verwendet werden.Wie die meisten Open-Source-Projekte setzt auch Elsa Workflow eine Zusammenarbeit primär über die in den GitHub-Issues geführten Diskussionen voraus. Zwar können PRs ohne vorangehende Diskussion durchaus akzeptiert werden, vor allem bei größeren Änderungen sinkt so aber die schnelle Erfolgsaussicht rapide.Einschätzung
Mit Elsa gibt es eine wahrlich grandiose Möglichkeit, die Fähigkeiten der Workflow Foundation in .NET-Core-Applikationen wiederaufleben zu lassen. Dank des webbasierten visuellen Designers und der verschiedenen Bereitstellungsmöglichkeiten können Anwendungen sehr einfach von Endanwendern erweitert werden.Populäre Projekte wie Orchard profitieren bereits von der Integration einer Workflow-Engine, wie auch Elsa-Autor Sipke Schoorstra im Interview erläutert (siehe Kasten). Sein Ziel, mit dem Framework jedem Entwickler solche Möglichkeiten zur Verfügung zu stellen, scheint meiner Meinung nach nicht nur nah, sondern bereits weitestgehend erfüllt zu sein.Fussnoten
- Elsa Workflows, http://www.dotnetpro.de/SL2102HiddenGems1
- Klik & Play, http://www.dotnetpro.de/SL2102HiddenGems2
- Workflow Engine, https://workflowengine.io
- Orchard Core, http://www.orchardcore.net