Table of Contents

Modular Components

Mit den Modularen Components wollen wir einen Baukasten schaffen, mit dessen Hilfe wir Objekte ausschließlich mit dem benötigten Funktionsaufwand erstellen können.

Unsere Motivation

Aktuell gibt es für BusinessLogik und Datenobjekte nur die Möglichkeit eine Component als Objekttyp anzulegen. Dieser Objekttyp bringt viele Funktionen (New, Load, Save, NotifyChanged-Logik, etc.) mit sich, welche nicht für jeden Verwendungszweck des Objekts benötigt werden. Zum Beispiel sollte eine Component, die ausschließlich Businesslogik enthält, nicht automatisch in eine Form eingebunden werden können. Diese Funktionalität sollte bei Bedarf, wie bei einem Baukasten, ausgewählt werden können.

Erstellen einer Modular Component

Beim Erstellen einer Modular Component kann zwischen den folgenden drei Typen gewählt werden: Interface, Class und UnitTest.

Verschiedene Modular Component Typen

Der Type kann nachträglich und auch im Customizing nicht geändert werden.

Interface wird zu Type Interface. Class und UnitTest wird zu Type Class.

Besonderheiten des Types UnitTests: Bei Modular Component (UnitTest) wird der Compile Step mit "UnitTest", das Attribute mit "[TestClass]" und die Base Class mit "FSTestBase" vorbelegt. Außerdem wird eine Methode MyTestMethod() mit dem Attribute "[TestMethod]" hinzugefügt.

Modular Components General

Unter der Registerkarte "General" kann die Modular Component im Allgemeinen definiert werden.

UI der Modular Component Typen

Compile Step

Es kann der Compile Step, wie bei CodeFiles, definiert werden. Dies entscheidet in welche DLL die Modular Component kompiliert wird.

Zur Auswahl stehen: Interface, Component, Service, UnitTest.

Der Compile Step kann im Customizing nicht verändert werden.

Attribute

An der Klasse, dem Interface, an Properties und Methoden können Attribute angegeben werden.

Attribute werden im Customizing über die Packages hinweg summiert und im UseCode an die Klasse generiert. Attribute aus der Basis können nicht bearbeitet werden, es können im Customizing ausschließlich neue Attribute hinzugefügt werden.

Für private Methoden und Properties sowie Fields ist dies natürlich nicht möglich. Dort werden die Attribute am jeweiligen Package-Code generiert. Attribute aus der BaseClass werden ebenfalls nicht übernommen.

Note

Obsolete Attribute sind von diesen Regeln ausgenommen. Dies werden sowohl am jeweiligen Package-Code, als auch am UseCode generiert. Sobald an einem Member aus der Basis das Obsolete-Attribute definiert wird, muss im Customizing das Obsolete eigenständig gesetzt werden. Es gibt keinen Automatismus.

Description

An der Klasse, dem Interface, an Properties und Methoden können Descriptions angegeben werden.

Die Description wird an die Klasse (bei Type Class) oder an das Interface (bei Type Interface) im UseCode generiert. Im Customizing kann die Description bearbeitet werden.

BaseClass

Im Feld BaseClass sind nur Klassen erlaubt, welche mit Fullname angegeben werden müssen. Dies kann für externe Klassen oder nicht Modular Component-Klassen händisch eingetragen werden. Oder es wird eine derived Modular Component über das Derive-Command im Namespace-Baum einer Basis Modular Component erstellt - ähnlich zur Form-Vererbung.

Modular Components vom Typ Interface können keine BaseClass besitzen, das Feld wird deshalb nicht angezeigt. Stattdessen können im Feld Interfaces mehrere Basis-Interfaces definiert werden.

Im Customizing kann die BaseClass nicht geändert werden. Das Feld BaseClass zeigt den Wert aus dem Basis-Package an.

Interfaces

Im Feld Interfaces können durch ein Komma getrennt mehrere Interfaces angegeben werden, welche die Modular Component implementieren soll. Es müssen FullNames (inkl. Namespaces) verwendet werden.

interfaces

Diese Interfaces werden 1:1 in den generierten Code der Klasse des entsprechenden Packages übernommen. Für eine Implementierung muss manuell gesorgt werden. Für bekannte Interfaces gibt es aber eine Unterstützung zum Erzeugen der entsprechenden Properties und Methoden.

"Bekannte" Interfaces sind derzeit andere Modular Components.

Im Customizing kann eine Modular Component weitere Interfaces implementieren - die im Basis-Package definierten Interfaces können hingegen nicht entfernt werden. Aus diesem Grund stellt das Feld Interfaces nicht den Wert aus dem Basis-Package dar.

Über den Button neben dem Feld öffnet sich ein Context-Menü mit Aktionen für bekannte Interfaces.

  • Open: öffnet die entsprechende Modular Component.

  • Implement: sofern die angegebene Modular Component vom Typ Interface ist, werden die fehlenden Properties und Methoden automatisch erzeugt. Dabei wird nur das jeweilige Interface und nicht dessen Basis-Interface(s) betrachtet.

Abstract Class

Durch das Setzen der Checkbox Abstract Class kann eine Klasse als abstract definiert werden.

Nur wenn die Klasse abstrakt ist, lassen sich abstrakte Methoden und Properties anlegen.

Im Customizing kann diese Einstellung nicht geändert werden.

Funktionale Einschränkungen der Modular Components

Funktionen, welche aus Components bekannt sind, jedoch nicht für Modular Components umgesetzt wurden:

  1. Verwendung der Modular Components in DataBindings ist nicht möglich. Auch bei Textboxen mit Autovervollständigungen werden Modular Components nicht angezeit. Es muss der FullName der Modular Component angegeben werden.
  2. Properties haben derzeit nur einen External DataType. Es muss der FullName bspw. einer Component angegeben werden. MDTs stehen ebenfalls nicht zur Auswahl.
  3. Interfaces können nicht customized werden. Hierzu gibt es allerdings einen Workaround.
  4. Bei abstrakten Klassen können in der Customization und im Service Release keine neue abstrakten Methoden und abstrakten Properties angelegt werden.

Properties und Methods

Properties

So sieht die UI im Bereich General der Properties aus:

Property UI

Einstellungsmöglichkeiten bei Properties:

Property Type: Auto Property, Individual Property, Field AccessLevel: public, internal, protected, private
Setter Types: get, get set, protected set
Virtual Modifier: virutal, abstract, override
Attributes
Description

Code Generierung: AutoProperties und IndivProperties werden immer mit virtual bzw. im Customizing mit override generiert. Public Properties werden automatisch virtual.

Bei Abstract Properties wird kein Getter und Setter generiert. Die Implementierung erfolgt in der implementierenden Klasse. In der Customization ist es nicht möglich neue abstrakte Properties anzulegen.

Für die Anzeige des Codes gibt es hier eine gemeinsame Ansicht des Getter und Setter-Codes. Mit gedrückter Shift-Taste und Doppelklick auf den Splitter kann die Ansicht von Vertical zu Horizontal (Get/Set Code wird dann untereinander angezeigt) und andersherum gewechselt werden.

Indiv Code

Im Property-Kontextmenü gibt es zwei zusätzliche Funktionen:

  • Property (Override), mit welcher Properties aus der Basisklasse überschrieben werden können und
  • Abstract Property, durch diese ein Property als abstrakt deklariert wird und somit keine Implementierung enthält. Dadurch werden die erbenden Klassen dazu verpflichtet, das Property zu implementieren.

Properties haben eine ComboBox Virtual Modifier zur Auswahl zwischen Virtual, Override und Abstract, um Vererbungs- und Implementierungsverhalten zu steuern - sprich das Überschreiben eines Properties oder Implementieren eines Abstract Properties.

Property override Kontextmenü

Methods

Typen: Constructor, protected Method, internal Method, abstract Method
Attributes
Description

Attribute werden bei Properties und Methods beim Typ Interface an den CodeCode des jeweiligen Packages, wo sie definiert wurden, im Code geschrieben. Dies verhält sich anders bei Class. Hier werden die Attribute im UseCode an Properties und Methods gesammelt generiert.

Abstrakte Methoden erhalten keinen Methodenbody. Es können in der Customization einer ModularComponent keine neuen abstract Methods angelegt werden.

Das Methoden-Kontextmenü wurde entsprechend erweitert.

Method Kontextmenü

Besonderheit TestMethod

Beim Typen UnitTest gibt es im Bereich der Methods das spezielle TestMethod-Command. Dieses Command fügt automatisch das Attribute "[TestMethod]" hinzu. TestMethods sind nicht virtual.

UnitTest Method

Copy und Paste von Methods und Properties

Copy & Paste der Methoden und Properties über verschiedene Objekttypen hinweg ist möglich. Zwischen Forms, Components und Modular Components kann kopiert werden. Da keine 1:1 Übersetzung möglich ist, muss vor allem bei der Kopie von Modular Component Properties in Components das Ergebnis überprüft werden.

Search Dependencies

Für die Modular Components werden folgende Elemente nach Dependencies durchsucht:

Important

Die Modular Components müssen überall mit FullName angegeben werden, sonst funktioniert die Dependency-Suche nicht!