Show TOC

Externes Context-MappingLocate this document in the navigation structure

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.

Hinweis Ein Beispiel für ein solches Mapping ist die Verwendung einer dunklen Component. Diese Component besitzt kein eigenes UI sondern dient ausschließlich der Bereitstellung von Daten für eine verwendende Component in welcher ein Layout definiert ist.

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.

Achtung Ein einfaches Context-Mapping wird immer im Context des betreffenden Controllers definiert. Der betreffende Controller gehört immer zu der von Ihnen aktuell bearbeiteten Component. Der Mapping-Pfad zeigt immer vom aktuell bearbeiteten Controller-Context zum Context-Knoten des verwendeten Interface-Controllers.

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.

Hinweis Sinnvoll ist ein externes Context-Mapping auf einen Context einer verwendenden Component immer dann, wenn die verwendete Component ein häufig verwendetes UI-Schema für unterschiedliche andere Components bereitstellen soll.

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.

Achtung Es ist nicht zulässig, für ein und die selbe Controller-Verwendung sowohl ein normales als auch ein externes Mapping einzurichten. Dies würde ein zyklisches Mapping zur Folge haben, welches zur Laufzeit unweigerlich zu Fehlern führt.

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:

  • Sobald für einen extern mapp-baren Knoten ein solches Mapping tatsächlich eingerichtet wird, entfällt zur Laufzeit der Aufruf einer eventuell ausprogrammierten Supply-Funktion. Ab diesem Moment verläuft die Versorgung des Knotens mit Werten für die Attribute ausschließlich über den Knoten der verwendenden Component.

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

  • statisch gegen die vorhandene Struktur und zusätzlich
  • dynamisch auf eventuell durch ein Mapping hinzugefügte Attribute programmiert werden.

Ein Knoten, für den ein externes Mapping definiert wurde, verfügt zudem nicht mehr über die Dispose-Methode.