Der erste HTML5 / JavaScript Web Client des VCR.NET Recording Service setzte zur Oberflächenanbindung auf jQuery(UI) ohne ein explizites Binding Framework wie etwa AngularJS. Ich habe an dieser Stelle einiges an Erfahrung sammeln müssen – nicht zuletzt auch was JavaScript Anwendungen und deren DOM Anbindung an sich angeht. So aus einiger (zeitlicher) Entfernung betrachtet ist die Vernetzung von Anwendungs- und Präsentationslogik doch sehr viel enger, als ich mir das eigentlich gewünscht hätte.
Ziel des neuen Web Clients ist es, diese Trennung sehr viel strenger vorzunehmen. Tatsächlich glaube ich, dass der Kern der Anwendung eigentlich ohne Präsentation lauffähig ist – das wäre für einen normalen MVC* Ansatz sicher genau so. Allerdings sind sich die Präsentationsmodelle durchaus bewußt, dass hier nicht irgendeine Anwendung implementiert wird, sondern dass konkret HTML5 angezeigt werden soll. So gibt es etwa zur Anzeige einer Zeitschiene oder der Pflege einer Zahl in einem festen Bereich über einen Slider konkrete Anwendungslogik, die indirekt mit dem DOM interagiert (Positionsangaben in %, Drag&Drop Benachrichtigungen usw.), ohne allerdings zu wissen, wie das DOM dann tatsächlich erstellt und nachgeführt wird – mein schon vor längere Zeit im Kopf entstandene Arbeitstitel dafür sind NoUi (eine Logik zur Anzeige einer HTML5 Anwendung ohne an irgendeiner Stelle irgendwas mit dem DOM zu tun zu haben) und Ui View Model (ein Präsentationsmodell, das nicht nur Modelldaten à la DTO unterstützt, sondern halt auch DOM relevante Fähigkeiten besitzt). Ok, hier im ersten Anlauf sicher noch zu grob in der Umsetzung, aber schauen wir mal, ob es eine nächste Version gibt.
Tatsächlich kann man so etwas natürlich auch mit AngularJS und den verschiendensten Konzepten darin umsetzen. Mein (subjektives!) Gefühl ist aber, dass ich mich dann tatsächlich auf Angular-For-Everything-And-Everytime festlege. Daher habe ich hier mit React.Js und (mal wieder: aber nur so lernt man wirklich etwas über die Anforderungen von Abläufen) eigener Anwendungslogik inklusive einer kleinen NoUi Bibliothek angefangen. Erst hatte ich ein bißchen schlechtes Gewissen, dass Zuckerberg schimpfen kommt, weil ich (bis auf eine Ausnahme) an keiner Stelle den State der React.Js Komponenten verwende. Aber die Redux Dokumentation belehrte mich dann eines Besseren: auch deren React.Js Integration verzichtet (im Allgemeinen) auf den React.Js State und bildet diesen auf den eigenen ab und das ist wohl auch gut so – wobei es durchaus nicht wirklich immer klar ist, wo man diesen Schnitt setzen sollte (nicht bezogen auf Redux sonder ganz allgemein betrachtet)!
Vielleicht stelle ich ja in Zukunft den Web Client noch weiter auf Bibliotheken wie Redux um (nicht zuletzt weil ich mich voraussichtlich in naher Zukunft auch beruflich damit intensiver auseinandersetzen werde), aber im Moment scheint mir der aktuelle Versuch im VCR.NET 4.5 Web Client auch nicht so falsch zu sein. Ja, ich nutze letztlich zwei Frameworks: eines für die DOM Manipulation und eines für die Anwendungslogik respektive des für die Anzeige relevanten Zustands. Im Hinblick auf die Programmierung in anderen Welten (Web Dienste / Middleware / Backend / Desktop Anwendungen e.g. mit C# und .NET) fühlt sich die aktuelle Implementierung mit einer echten Objektstruktur und daraus gezielt zur Anzeige gespiegelten Teilzustände richtig an. Redux scheint da zwar viel pragmatischer und mit seinem Plain-Object-State sehr viel einfacher zu sein, aber ohne Redux praktisch eingesetzt zu haben scheinen mir die wesentlichen Kernanforderungen eines realen Web Clients nicht verschwunden, sondern einfach nur in viele AddOns / PlugIns / Extensions ausgelagert zu sein. Darüber kann und will ich mir heute kein Urteil erlauben – schauen wir mal, was die nächsten Monate bringen.
Falls jemand sich die Quellen des Web Clients mal anschauen möchte, hier nur kurz ein kleiner Stadtplan: es gibt präsentationsfreie Anwendungslogik in einer kleinen Bibiothek und den VCR.NET Teil selbst. Dazu einen auf React.Js basierenden Satz von übergreifenden Komponenten sowie auch hier separat der VCR.NET Teil, diesmal weiter aufgeteilt in spezialisierte und gemeinsame React.Js Komponenten. Dazu kommen noch Typdefinitionen und Proxies für die REST Web Dienste des VCR.NET Recording Service und der Rahmen der SPA.
Viel Spaß und hoffentlich irgendwann einmal mehr zu dieser Baustelle
Jochen