Laufzeiteinstellungen

Über die Eigenschaft Setting können die Einstellungen zur Laufzeit abgefragt und ggf. verändert werden. Welche Einstellungen vorgesehen sind, wird in einer zentralen Liste (RSET) festgehalten. Welche dieser potentiellen Einstellungen in dem jeweiligen Baustein verwendet werden, und ob diese auch verändert werden können, wird in der Schnittstellenbeschreibung des Bausteins festgelegt. ExpEdge berücksichtigt diese Angaben und erzeugt den Abschnitt Setting für den jeweiligen Baustein entsprechend dieser Angaben.

Technische Grundlage

Die Laufzeiteinstellungen werden in der Windows-eigene Registry gesucht und abgelegt. Dabei wird unterschieden zwischen Systemeinstellungen, die unterhalb von Software\TAA abgelegt werden, und allgemeine Einstellungen, die unter Software\<ID> abgelegt werden, wobei ID das Kürzel des Mandanten entspricht. Das Kürzel wird typischerweise in der Registry unter Software\TAA\Company\Abbrev eingetragen und gefunden.

Die in der Registry gespeicherten Einstellungen können logisch jedoch an bis zu vier verschiedenen Stellen untergebracht sein, benutzerspezifisch oder für alle Benutzer gleich, und dort jeweils wiederum umgebungsspezifisch oder umgebungsübergreifend. Details sind hier beschrieben. Grundsätzlich gilt, dass ein vorhandener Eintrag an der Stelle verändert wird, wo diese aufzufinden ist. Wenn der Eintrag noch nicht vorhanden ist, wird sie an der ersten schreibbaren Stelle untergebracht.

Eigenschaften einer einzelnen Einstellung

Wenn eine Einstellung geboten wird, so hat diese die Eigenschaften Exist und Value. Mit der Eigenschaft Exist kann abgefragt werden, ob für die Einstellung einen spezifischen Wert eingetragen ist. Mit der Eigenschaft Value kann der Wert der Eigenschaft abgefragt, und je nach Angaben in der Schnittstelle des Bausteins, auch verändert werden. Der Typ der Value Eigenschaft entspricht den Angaben für die Eigenschaft aus der zentralen RSET-Tabelle und kann somit String, DateTime, Boolean oder UInt32 sein.

Wenn eine Einstellung für einen erweiterten Kontext in der RSET-Tabelle markiert ist, so ist die Einstellung nicht ein einzelnes Feld im Abschnitt Setting, sondern eine Aufzählung. Die möglichen resp. vorhandenen Einträge können über einen IEnumerable<> aufgezählt werden, und einen einzelnen Eintrag kann mit einem String als Argument für den Indexer direkt angesprochen werden.

Wenn eine Einstellung einen Kontext benötigt hat, ist dieser als Zeichenfolge Context an der Einstellung abfragbar. In den folgenden Fällen hat eine Einstellung einen Kontext:

  • Die Einstellung ist als zugehörig zu einer Anwendung definiert (Affinity Application). In diesem Fall ist der Context der Name der Anwendung.
  • Die Einstellung ist als zugehörig zu einem Baustein definiert (Affinity Module). In diesem Fall ist der Context die vollständige Bezeichnung des Bausteins, bestehend aus Anwendung, Typ und Namen des Bausteins, jeweils durch einen Punkt getrennt.
  • Die Einstellung ist das Ergebnis einer Auflistung für eine Einstellung, die für einen erweiterten Kontext in der RSET-Tabelle markiert ist (Flag WithArgument)

Beispiele

Nachfolgend wird beschrieben, wie man eine Einstellung in der RSET-Tabelle definiert, wie diese anschließend in der Schnittstelle zur Verwendung markiert wird, und anschließend wie die Einstellung im Code benutzt werden kann.

Einfache Systemeinstellung

Als Beispiel nehmen wir die Einstellung Config\BcLockDir. Die TAA kennt diese Einstellung für die Konfiguration eines zentralen Verzeichnisses für Sperrdateien, um arbeitsplatzübergreifende Sperren implementieren zu können. Um diesen Eintrag auch im Anwendungscode kontrolliert benutzen zu können, muss diese zuerst in der RSET-Tabelle eingetragen werden resp. worden sein.

Wir tragen als Beispiel diese Einstellung mit dem Namen Sperrverzeichnis und der Umschreibung Zentrales Verzeichnis für Sperrdateien ein, und setzen folgende Flags:

  • Readonly (0x00000001): weil der Wert grundsätzlich zentral verwaltet wird, für alle Benutzer gilt und nicht verändert werden soll
  • System (0x00000008): weil die Einstellung unterhalb der TAA, und nicht mandantenspezifisch zu finden ist

Als sog. Affinity wird Config (0x00000004) eingetragen, weil die Einstellung im Config-Abschnitt abgelegt wird. Außerdem wird als Entry BcLockDir angegeben, weil die Angabe in der Registry so benannt wird. Man beachte, dass keine spezifischen Angaben in den Flags zum Typ der Einstellung gemacht wurden. Damit ist diese Einstellung grundsätzlich als Zeichenfolge benutzbar.

Die Zeile in der RSET-Tabelle sieht nun wie folgt aus:

Name Bezeichnung Flags Affinity Default Entry
Sperrverzeichnis Zentrales Verzeichnis für Sperrdateien 9 4 NULL BcLockDir

Hiermit ist die Einstellung zur Benutzung definiert und kann in der Schnittstellenbeschreibung benutzt werden. Dazu kann man beispielsweise das Werkzeug InterfEdge starten und in die Laufzeiteinstellungen-Sicht wechseln1):

Durch das Ändern der Rolle von NOP auf REF wird diese Einstellung als benutzbar für den Baustein vorgemerkt und kann im Anwendungscode angesprochen werden2). Man beachte, dass die Rolle MOD gar nicht erst von der Oberfläche angeboten wird, weil diese Einstellung in der RSET-Tabelle als Readonly markiert wurde. Diese Einstellung könnte nun im Code wie folgt angesprochen werden:

if (this.Setting.Sperrverzeichnis.Exist &&
   Directory.Exists(this.Setting.Sperrverzeichnis.Value)) {
   // arbeite mit daten im sperrverzeichnis
}

Es ist natürlich im obigen Beispiel nicht unbedingt nötig, vorher den Exist abzufragen. Wenn der Eintrag nicht vorhanden ist, wird ein Defaultwert geliefert, die auch wiederum in der RSET-Tabelle festgelegt werden kann. Natürlich ist auch hier wiederum IntelliSense hilfreich:

Systemeinstellung mit erweitertem Kontext

Die Systemeinstellung für die Einstellung zum zwischenspeichern der Daten aus gewissen Datenquellen soll abfragbar für die Anwendung werden. Da die betroffene Datenquelle nicht direkt aus dem Laufzeitkontext abgeleitet werden kann, soll diese als zusätzlicher Kontext übergeben werden. Dazu kann in der RSET-Tabelle folgender Eintrag vorgenommen werden:

Name Bezeichnung Flags Affinity Default Entry
Caching Werden DB-Ergebnisse zwischengespeichert 1310853) 16 0 NULL

Im Anwendungscode könnte die Einstellung für eine bestimmte Datenquelle damit wie folgt abgefragt werden:

if (this.Setting.Caching["db2r"].Value) { ... }

Da es sich hier um eine Einstellung mit erweitertem Kontext handelt, kann die Einstellung auch aufgezählt werden. So könnte bspw. folgender Code folgende Ausgabe produzieren:

foreach (var item in this.Setting.Caching) {
   Console.WriteLine(item.Context + " = " + item.Value);
}
 
// console output:
//
//  Access = False
//  db2r = False
//  PeapDb0 = False
//  PkEdge = False
//  RefMDB = True

Allgemeine Einstellung

Es soll eine Laufzeiteinstellung Umsetzung eingerichtet werden, die pro Baustein gesetzt sein kann. Die Einstellung ist keine Systemeinstellung seitens der TAA, sondern eine mandantenspezifische Einstellung. Die Einstellung soll zentral vorgenommen und nicht vom Anwendungscode angepasst werden können. Außerdem soll die Einstellung nur für Testzwecke verwendet werden dürfen. In einer nicht-Test Umgebung soll immer der Vorgabewert „VB“ gelten. Dazu kann in der RSET-Tabelle folgender Eintrag vorgenommen werden:

Name Bezeichnung Flags Affinity Default Entry
Umsetzung Art der Umsetzung des Bausteins 3 1 VB NULL

Im Anwendungscode könnte diese Einstellung dann bspw. wie folgt benutzt werden:

this.State.Active = this.Setting.Umsetzung.Value == "C#" ? StateEnum.Ok : StateEnum.Vb6;
1)
diese Sicht ist nur dann verfügbar, wenn es überhaupt definierte Einstellungen in der RSET-Tabelle gibt
2)
nach erfolgreicher Neugenerierung der betroffenen Ressourcen-DLLs und der Basisassembly
3)
entspricht 0x0002000D und damit den Flags Readonly, WithArgument, System und den Datentyp Boolean.
dotnet:native:settings · Zuletzt geändert: 03.02.2017 13:39

Copyright © 1992-2024 TeamWiSE Gesellschaft für Softwaretechnik mbH         Adressen |  Kontakt |  AGB |  Datenschutzerklärung |  Impressum