24 August 2014

Kein MEF für Universal Apps?

Das Konzept hinter den Universal Apps finde ich sehr gut, wie in den letzten Beiträgen geschrieben wende ich es gerade testhalber bei RK 2048 an. Ein Negativpunkt für mich ist aber die fehlende Unterstützung für System.Composition. Bei WinRT für Tablets / Desktop gibt es den Umweg über MEF 2, welcher eigentlich auch relativ gut funktioniert. Für das Windows Phone scheint es das aber nach wie vor nicht zu geben, derweil ist die Funktionalität m. E. schon sehr praktisch. Damit ich trotzdem etwas Ähnliches habe, habe ich mir entsprechend selber Klassen dafür geschrieben, die auch mit dem Universal App Template laufen.

Aber eines nach dem anderen.. warum brauche ich MEF eigentlich? Ein Beispiel liegt in meiner 3D-Engine. Diese ist grundsätzlich so ausgelegt, dass sie sich in Windows.Forms, Wpf und eben WinRT einbinden lässt. Bei all den ganzen View-Klassen und dazu noch verschiedenen Kamera-Varianten ergeben sich somit entsprechend viele Verzweigungen bez. Tastatur- und (3D-)Maus-Eingabe. Die Eingaben lagere ich deswegen in eigene Klassen, sogenannte InputHandler aus, welche über MEF gesucht und je nach Situation dynamisch instanziiert werden.

Die Umsetzung sieht bei mir folgendermaßen aus: Während dem Start des Programms wird eine allgemeine Initialisierungs-Logik durchlaufen – auf jeder Windows-Plattform die gleiche. Dort wird z. B. die 3D-Engine initialisiert, der Service-Container geladen und noch ein paar andere allgemeine Sachen. Zusätzlich habe ich jetzt eine Klasse geschrieben, welche alle aktuell geladenen Assemblies nach Types durchschleift und sich diese in einem Cache zwischenspeichert. Damit das alles effizient abläuft, werden alle Types, welche über meinem Mechanismus gefunden werden sollen, auf folgende weiße mit einem Attribut auf Assembly-Ebene markiert:

Dieser Ansatz macht das Schleifen über alle relevanten Typen einer Assembly sehr effizient, da nicht alle Typen, sondern nur nach den Attributen gesucht werden muss. Nachfolgend der Suchalgorithmus:

Das „lock“ ist aktuell eher dirty, später kommt hier wahrscheinlich noch ein Reader-Writer-Lock hin. Der Rest ist aber sehr einfach und effizient gehalten, damit diese Logik auch auf dem Windows Phone nicht für lange Ladezeiten sorgt. Auf die gefundenen Klassen zugegriffen wird anschließend auf eine ähnlich einfache Weise:

Einfach, oder? Das alles war jetzt auch nur eine Arbeit von ein paar Minuten + etwas Test. Der Mangel von MEF lässt sich bei Universal Apps also auch leicht ersetzen, zumindest, was meine doch recht einfache Anforderung angeht.


Schlagwörter: , ,
Copyright 2019. All rights reserved.

Verfasst 24. August 2014 von Roland in category "Allgemeines

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.