Adventtipp 17 – Sitecore mit Glass.Mapper – einfache Serialisierung von Sitecore Items

Sitecore mit Glass.Mapper

 

Wer regelmäßig Datenbankzugriffe programmiert, kennt das Dilemma: man schreibt sehr viel (No-)SQL Abfrage-Code über zig Tabellen, Feldern und Operatoren hinweg, um teilweise einfachste Datenbezüge zu ermöglichen. Dies bremst die Produktivität, zudem macht man sich durch das schreiben der SQL-Befehle abhängiger von einem bestimmten Datenbanktyp. Dieser Tipp befasst sich mit Glass.Mapper, einem ORM Framework auf Open Source-Basis, welches in keinem Sitecore-Projekt fehlen darf.

Um der Produktivitätsabnahme Abhilfe zu schaffen, lohnt sich der Einsatz sog. Objektrelationalen Mapper (ORM) bzw. die “Objektrelationale Abbildung”. Mittels ORM werden Datenbankobjekte direkt in Objekte einer Programmiersprache überführt. Im .NET-Umfeld ist das Entity Framework von Microsoft der bekannteste Vertreter, wo jeder sicherlich jeder schon mal eine Abfrage mit LINQ unternommen hat.

Mit Glass.Mapper for Sitecore, einem Open Source ORM Framework (mit Apache Lizenz), wird der Zugriff auf Sitecore-Datenbankobjekte stark vereinfacht. Das Framework wurde von Mike Edwards (mit Sitz in Bath, Großbritannien) entwickelt, welcher als langjähriger Sitecore MVP viel Erfahrung gesammelt hat. Seit der ersten Version im Jahr 2011 hat sich mit der aktuellen v4 viel getan. Glass.Mapper unterstützt alle Sitecore Versionen ab v6. Die mittels Glass.Mapper verwalteten Objekte erlauben einen direkten Zugriff auf Sitecore-Objekte in beide Richtungen, lesend und schreibend. Glass.Mapper generiert automatisch Klassen und Schnittstellen von Sitecore Objekten, welche bei Benutzung in den Zieltyp konvertiert werden oder erstellt diese auch erst bei Bedarf mittels Attributierung.

Installation

Die Installation ist denkbar einfach:

  1. Sicherstellen, dass Sitecore.Kernel.dll und System.Web.Mvc.dll (bei MVC-Projekten, ansonsten nur System.Web für WebForms) vorhanden sind. Letzteres ist z.B. bei Installation des Paketes “Microsoft ASP.NET MVC” der Fall.
  2. In Visual Studio mit dem Nuget Package Manager den Download und die Installation von Glass.Mapper.Sc vornehmen
  3. Es werden 4 Glass-Bibliotheken, diverse App-Config und App-Start-Dateien angelegt

Bei der Installation prüft der Installer mittels eines Powershell-Skriptes die Sitecore-Version und installiert davon abhängig die nötigen Bibliotheken.

Konfiguration

Die Glass.Mapper Installation hat diverse .config-Dateien im App-Config abgelegt. Werfen wir mal einen kurzen Blick darauf:

  • Glass.Mapper.Sc.config bzw. Glass.Mapper.Sc.Mvc.config:
    Diese Konfiguration setzt die mvc.GetModel Pipeline Integration von Glass.Mapper sowie ein GlassCacheClear-Event für den Sitecore Publisher.
  • Glass.Mapper.Sc.Start.config:
    Hier wird der zu initialisierende Pipeline-Prozessor definiert, welcher beim Applikationsstart ausgeführt wird. Auf diesem Wege lassen sich z. B. Config Maps, Dependency Resolver, Factories etc. integrieren, welche Glass.Mapper pass genau für sein Projekt erweitert.

Es gibt noch weitere Konfigurationsmöglichkeiten wie z.B. für Castle Windsor, einer alternativen Dependency Injection-Bibliothek. Diese ist aber seit Version 4 nicht mehr direkter Teil von Glass und nur bedingt zu empfehlen.

Die sog. Fluent-Konfiguration ist die empfehlenswerteste Variante, diese erspart die ansonsten noch auftretende Handarbeit bei der Nutzung von Attributen, welche nicht Teil dieser Beschreibung sind. Details zur Konfiguration finden sich hier.

Es ist sehr zu empfehlen Glass so einzustellen, dass die Sitecore Objekte alle auto-generiert vorliegen. Glass kümmert sich sozusagen im Hintergrund immer um einen aktualisierten Stand, weitere Handarbeit beim Sitecore Coding entfällt.

Glass beim modellieren zuschauen

Es ist eine gute und empfehlenswerte Praxis, das Model ist einem separaten Modul auszulagern, damit dieses über alle Projektteile einfacher wiederverwendet werden kann. Das so eigens angelegte Model-Projekt, welches Teil meiner Solution ist, wird um das von Glass auto-generierte Model mit den Sitecore Objekten ergänzt.

So ein Auto-generiertes Model, wie sieht das eigentlich aus? Werfen wir mal einen Blick hinein.

Glass.Mapper legt für jeden Sitecore Objektknoten den Namespace mit dem Projektnamen (wie üblich) sowie den Sitecore Item Namen an. Beispiel: in Sitecore Template-Ordner existiert ein Item “Namics”, welches eine weiteres Item “Content” beinhaltet. Der generierte Namespace liest sich wie der Pfad zum Item:

Erweiterbarkeit des Glass.Mapper Models

Das auto-generierte Model kann man z.B. einfach durch eine eigene GlassBase-Klasse erweitern, um einfachere Methodenzugriffe zu erlauben. Dazu im Model-Projekt die Klasse GlassBase.cs anlegen und diese als Partial Interface definieren. Beispiel:

Tipp: in größeren Sitecore-Projekten wird gerne stark modularisiert implementiert. Die für ein jeweiliges Modul vorliegenden Glass.Mapper Models beinhalten eventuell aber nur einen Teil eines Sitecore Objektes, wenn diese mittels Datenvererbung entsteht. Typisches Szenario: ein Basisobjekt mit z.B. generellen Adressangaben findet sich in Modul A, ein Objektteil, welcher ohne Vererbung nicht vollständig dargestellt ist und die Adressangaben speziell erweitert, findet sich aber in Modul B. Auch hier schafft der Einsatz einer Partial Interface-Implementierung abhilfe. Leider kann der Glass.Mapper dieses aktuell noch nicht (quasi Modulübergreifend) auto-generieren, etwas handarbeit ist gefragt.

Entwicklung

Die folgenden Beispiele zeigen den typischen Einsatz von Glass.Mapper, welche den schnellen Zugriff auf Sitecore Objekte erlaubt.

Im Komponenten-Service

Das Sitecore Objekt “Customer Address”, welches uns auto-generiert vorliegt, wird mit dem folgenden Beispiel dem View Model übergeben, wo dann im späteren View voll auf alle Objektteile bezug genommen werden kann.

Die Methode CustomerAddressViewModel() befüllt das vorliegende Model, wobei das “dataSourceItem” das ursprüngliche Sitecore Objektmodell, also die Template Items, beinhaltet. Der verwendete ISitecoreContext ist der Glass.Mapper.Sc.ISitecoreContext.

Im Controller

Das Glass.Mapper Model wird im MVC Controller für das Sitecore Rendering View, welche via einer ActionResult()-Methode aufgerufen wird, nur durchgereicht.

GetLayoutItem() wird von GlassController genutzt, welche Teil der Glass.Mapper.Sc.Web.Mvc ist.

Zugriff auf Sitecore Objekte im View

Der Zugriff auf ein via Glass.Mapper auto-generiertes Sitecore Item ist dann wieder so einfach, wie man dies auch ohne Glass.Mapper kennt.

Auch Sublayouts mit Inherit funktionieren auf diesem Wege. Bei einem Partial Layout wird das Model einfach mit durchgereicht.

Sitecore Items Children

Der Zugriff auf Children Items via Glass.Mapper ist denkbar einfach. Im Model wird mit dem bekannten Property “Children” dieses automatisch gesetzt, insofern dies natürlich nicht in der Konfiguration anders definiert wird.

Einfache Iteration im Code. Folgendes Beispiel interiert durch die Kindelemente eines Navigation Item inkl. einer Bedingung und liefert diese als Liste zurück.

Editierbarkeit im Layout – Page Editor

Glass.Mapper unterstützt die Editierbarkeit von Items im Sitecore Experience Editor. Voraussetzung ist nur das erben von Glass.Mapper.Sc.Web.Mvc.Glass.View sowie der Einsatz von Glass.Mapper.Sc.Razor.

Einfache Editierbarkeit

Editierbarkeit von RenderLinks und RenderImage

Die beiden letzten Beispiel zeigen Einsatz von Parametern, welche man hier sehr nützlich direkt einbetten kann. Das daraus von Sitecore generierten Markup lässt sich so gezielt aufpeppen.

Editierbarkeit mit Frame

Unit Testing

Ein großer Vorteil beim Einsatz von Glass.Mapper ist, dass man Sitecore Objekte direkt Teil eines Unit Tests machen kann. Jedes größere Sitecore Projekt kommt hierbei sicherlich nicht mehr ohne aus und es gilt als selbstverständlich, mindestens die Service-Klassen und komplexeren Teile einer Applikation mit den automatisierten Unit Tests zu versehen.

Unit Test Frameworks wie NUnit und Moq lassen sich sehr einfach für Sitecore-Projekte integrieren. Ein Beispiel mit Zugriff auf ein Sitecore Objekt:

 

Sitecore Objekte syncen mit TDS – Team Development for Sitecore

Für TDS-Repositories kann der Glass.Mapper auf Wunsch automatisch Code für Sitecore Objekte & Templates erstellen.

Kurzanleitung für die Installation:

  1. Für das jeweilige TDS-Projekt die Code Generierung aktivieren
  2. “T4” Template herunterladen
  3. “TT”-Dateien dem TDS-Projekt im Verzeichnis “Code Generation Templates” hinzufügen
  4. Code Generierung Target auswählen, Namespace vergeben
  5. Header Transformation File: “glassv3header.tt”
  6. Base Project Transformation File: “glassv3item.tt”
  7. Mittels “Re-Generate Code for all Items” testen

Glass erstellt dabei die Klassen und Interfaces aller TDS Items des Projektes für das definierte Target.

Zusammenfassung

Es gibt noch eine Menge mehr Einsatzmöglichkeiten des Frameworks, diese alle vorzustellen würde die Länge des Artikels aber mehr als sprengen. Dieser kurzweilige und schnelle Einblick soll aufzeigen, dass es wenig Anlass gibt Glass.Mapper nicht zu verwenden.

Der Einsatz von Glass.Mapper hat große Vorteile:

  • Zugriff auf streng-typisierte Objekte
  • POCO, kein Wrapping
  • Sitecore Objekte werden Unit Testfähig
  • Erweiterbarkeit
  • Unterstützung von Editable Fields und Edit Frames in MVC
  • Der Einsatz von Interfaces für den Zugriff auf Sitecore Objekte
  • Starke Reduktion des Implementierungsaufwandes

.. aber auch Nachteile:

  • Zugriffsperformance sinkt leicht durch den ORM, da die SQL-Queries Systemseitig und (nicht immer) optimiert generiert vorliegen
  • Nicht für alle Zugriffsarten geeignet
  • Etwas Konfigurationsaufwand

Die Vorteile überwiegen klar den Nachteilen, wobei man bei sehr hohen Performance-Ansprüchen den Einsatz eines ORM Framework grundsätzlich immer abwägen muss.
Im Zusammenspiel mit TDS, dem Team Development for Sitecore-Tool der Fa. Hedgehog, entfaltet Glass.Mapper seine volle Wirkung. Die mittels TDS synchronisierten Sitecore-Objekten können direkt als Glass Interfaces auto-generiert werden. Grundsätzlich ist hier TDS aber keine Voraussetzung, Glass.Mapper kann auch Standalone eingesetzt werden.

Es gibt auch andere Sitecore ORM-Produkte wie z.B. von Synthesis, Glass.Mapper hebt sich hierbei aber wohltuend ab. Letztendlich hängt dies immer von den genauen Anforderungen eines Projektes ab, welche Lösung hierzu relevant wird. In den allermeisten Fällen kommt zu recht der populäre Glass.Mapper im Einsatz, welcher sich zurecht als “#1 ORM for Sitecore” bezeichnen darf.

Weitere Informationen und Lesetipps:

Hinterlasse eine Antwort

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

*

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>