
Im Kapitel Component-übergreifendes Context-Mapping wurde der Mechanismus eines Mappings über die Grenzen einer Web-Dynpro-Component hinweg beschrieben. Die Component A verwendete in dem dargestellten Beispiel eine Component B, für den Knoten Node 1 des Component-Controller-Contexts von A wurde ein Mapping definiert auf den gleichnamigen Knoten des Interface-Controller-Contexts von Component B. Beide Components sind zur Design-Zeit bekannt. Zum besseren Verständnis ist in der folgenden Abbildung das einfache Context-Mapping wie im o.g. Kapitel noch einmal dargestellt:
Über die Mapping-Definition erhält die Component A zur Laufzeit den Wert für ihren Component-Controller-Context aus dem Interface-Controller der Component B - Mit anderen Worten:
Der Knoten des Interface-Controller-Contexts ist in dieser Mapping-Beziehung der "Quell"-Knoten.
Im Fall des externen Context-Mappings ist der Informationsfluss genau umgekehrt:
Die verwendete Component B definiert an ihrem Interface-Controller-Context einen Knoten der für ein externes Context-Mapping freigegeben wird. Im Controller Editor wird dies beim Anlegen eines Knotens für den Interface-Controller mit der Eigenschaft Input-Element (Ext). beschrieben. Diese Eigenschaft steht explizit nur solchen Context-Knoten des Component-Controllers zur Verfügung, die auch als Interface-Knoten markiert sind.
Ein derart markierter Knoten des Interface-Controller-Contexts kann mit einem Context-Knoten einer verwendenen Component verbunden werden und erhält so erst zur Laufzeit die zugehörigen Werte vom Context-Knoten der verwendenen Component A.
In diesem Fall ist der Knoten Node 1 des Component-Controllers der Component A der "Quell"-Knoten und legt somit zur Laufzeit die Werte auch für den gleichnamigen Knoten des Interface-Controller-Contexts der Component B fest.
Im Gegensatz dazu wird ein externes Context-Mapping immer im Controller-Context der betreffenden Component-Verwendung definiert. Sie definieren ein externes Mapping immer für einen geeigneten Knoten eines "fremden", von Ihnen verwendeten Interface-Controllers. Der Mapping-Pfad zeigt in diesem Fall immer vom Context des verwendeten Interface-Controllers auf einen Knoten im aktuell bearbeiteten Controller-Context.
Normalerweise wird der extern zu mappenden Knoten beim Anlegevorgang vollständig typisiert. Sie legen also bereits zur Design-Zeit fest, welche Knoten und Attribute der extern mapp-fähige Knoten beinhaltet. Dies hat insbesondere den Vorteil, dass innerhalb des zugehörigen Controllers statisch auf diesen Knoten programmiert werden kann. Dazu gehört auch, dass ein UI-Element an diesen Knoten gebunden werden kann.
Ein Beispiel
Im Rahmen einer größeren Anwendung wird eine Component gestaltet mit der eine Adresse zur Anzeige gebracht werden soll. Der Zusammenhang, aus dem die Adressen gewählt werden ist zur Design-Zeit völlig offen, der Inhalt eines zugehörigen Models zu der Adress-Anzeige nicht bekannt. Da jedoch mit Hilfe der Adress-Component nur Adressen aus einem Land dargestellt werden sollen, ist die Gestaltung des View-Layouts möglich. Man kann also eine Component zur Darstellung von Landes-spezifischen Adressen aufbauen und die UI-Elemente an eine extern-mappbaren Knoten binden. Diese Component kann nun von den unterschiedlichsten anderen Components verwendet werden und durch die Einrichtung eines externen Mappings wird die Adress-Anzeige mit den jeweils relevanten Daten versorgt.
Der Unterschied zwischen normalem und externem Context-Mapping
Die Frage nach den Kriterien für oder gegen den Einsatz eines externen Context-Mappings besitzt nicht immer eine eindeutige Antwort. Technisch lässt sich in vielen Fällen das gewünschte Resultat sowohl über ein externes als auch über ein normales Mapping erreichen wenn das Design der Anwendung entsprechend umgestellt wird. Grundsätzlich besteht jedoch folgender Unterschied:
Weiterführende Konzepte
Sie können den extern zu mappenden Knoten beim Anlegevorgang auch völlig ungetypt lassen. Der Knoten bekommt in diesem Fall seine komplette Typisierung erst durch den Context-Knoten, für den ein Mapping auf externen Knoten definiert wird. Gegen einen so angelegten Knoten kann im zugehörigen Controller jedoch nur dynamisch programmiert werden da seine Struktur zur Design-Zeit noch nicht bekannt ist (siehe Teil 3: Dynamische Programmierung)
Wenn der extern zu mappende Knoten der verwendeten Component eine bestimmte Struktur vorgibt, muss diese auch im Context-Knoten der verwendenden Component (A in unserem Beispiel) enthalten sein. Zusätzlich kann dieser Knoten jedoch noch weitere Attribute enthalten welche zur Design-Zeit dem Interface-Controller der Component B nicht bekannt sind. In diesem Fall kann im Interface-Controller von Component B
Ein Knoten, für den ein externes Mapping definiert wurde, verfügt zudem nicht mehr über die Dispose-Methode.