ein Projekt von goloroden.de
Skip Navigation Linksguide to C# > Guide > Anwendungsarchitektur

Anwendungsarchitektur

Lösungen und Anwendungen

Warum werden Anwendungen entwickelt? Die Beantwortung dieser Frage setzt voraus, dass eine Definition des Begriffs Anwendung vorliegt, auf die man sich beziehen kann.

In erster Linie werden Anwendungen entwickelt, um Aufgaben einer spezifischen Domäne zu erledigen und die damit einhergehenden Probleme zu lösen. Daher wäre es eigentlich angebracht, an Stelle von Anwendungsentwicklung von der Entwicklung von Lösungen zu sprechen. Dennoch wird im alltäglichen Sprachgebrauch der Begriff der Anwendung häufig synonym mit dem der Lösung verwendet.

Dabei darf allerdings nicht vergessen werden, dass eine moderne Anwendung - im Sinne einer Lösung - sehr wohl aus mehr als nur einer Anwendung - im Sinne einer ausführbaren Anwendung - bestehen kann.

Einerseits kann nämlich bereits die eigentliche Funktionalität auf mehrere Anwendungen verteilt werden, wie es beispielsweise in Umgebungen mit einer Server- und mehreren Client-Anwendungen der Fall ist. Andererseits wird gerade für Webanwendungen häufig eine zusätzliche Windowsanwendung zur Wartung entwickelt.

Außerdem nutzen die meisten modernen Anwendungen eine Reihe unterstützender Anwendungen, wie eine Datenbank, einen Webserver und sonstige Services, die zwar nicht direkt integriert sind, aber dennoch - wie die eigentliche Anwendung - ihren jeweiligen Teil zur übergeordneten Lösung beitragen.

Insofern sind Anwendungen genau genommen autonome Bestandteile einer Lösung und kommunizieren miteinander über definierte Schnittstellen und Kanäle. Dennoch werden im folgenden die Begriffe Anwendung und Lösung synonym verwendet, da die in diesem Buch entwickelten Lösungen zumeist nur aus einer einzelnen Anwendung bestehen.

Komponenten und Assemblies

Die hierarchische Struktur einer Lösung mit mehreren untergeordneten Anwendungen besteht vergleichbar auch innerhalb einer einzelnen Anwendung. Waren diese früher häufig monolithisch - also aus einem Guss - aufgebaut, werden heutzutage in der Regel eine Reihe von eigenständigen Komponenten entwickelt, die anschließend miteinander integriert und zu einer Anwendung verschmolzen werden.

Komponenten zeichnen sich vor allem durch zwei Aspekte aus: Zum einen sind sie autarke, in sich abgeschlossene Einheiten, die nicht von anderen Einheiten abhängen. Auf Grund dessen kann die Entwicklung einer komponentenorientierten Anwendung problemlos innerhalb eines Teams aufgeteilt werden. Zum anderen verfügt jede Komponente über eine definierte Schnittstelle, über die sie von außen angeprochen werden kann. Um eine Komponente in eine Anwendung einzubinden, muss nur ihre Schnittstelle, nicht aber ihr innerer Aufbau bekannt sein, so dass eine Komponente als Blackbox fungiert.

Außerdem sind verschiedene Komponenten untereinander austauschbar, sofern sie die gleiche Schnittstelle bereitstellen. Dies erleichtert nicht nur die Wartbarkeit von Anwendungen, da im Nachhinein problemlos einzelne Komponenten an Stelle der ganzen Anwendung ausgetauscht werden können. Zudem wird auch die Testbarkeit verbessert, da bei einer Änderung in einer Komponente nur diese erneut getestet werden muss, nicht aber die vollständige Anwendung.

Auf Grund dieser Eigenschaften spielen Komponenten eine essenzielle Rolle in der modernen, teambasierten Anwendungsentwicklung.

Eine Komponente besteht - wie bereits Lösungen und Anwendungen - wiederum aus kleineren Bestandteilen, den Assemblies. Eine Assembly ist dabei ein Konzept, das von Microsoft in .NET neu eingeführt wurde. Diese wird physisch von einer Datei mit der Endung .dll oder .exe repräsentiert, wobei eine Assembly außer der Dateiendung nicht viel mit einer klassischen Datei mit der selben Endung gemein hat.

Eine Assembly enthält in erster Linie ausführbare Anweisungen in MSIL. Zudem kann sie aber noch Ressourcen enthalten, die zur ihrer Ausführung benötigt werden, wie beispielsweise Bilder oder Klänge. Erzeugt wird eine Assembly aus einer oder mehreren Dateien, die Anweisungen in C# enthalten, und zusätzlich aus den einzubindenden Ressourcendateien.

Außerdem verfügt eine Assembly über Metadaten, die ihren Inhalt näher beschreiben. So werden nicht nur Angaben zu den enthaltenen Anweisungen und Ressourcen gemacht, sondern auch Informationen über die Assembly an sich wie beispielsweise ihr Hersteller und ihre Versionsnummer bereitgestellt.

Datentypen

Die Anweisungen in einer Assembly, die ursprünglich in C# geschrieben wurden, sind ihrerseits allerdings noch einmal in sogenannten Typen organisiert, und zwar gemeinsam mit den Datenstrukturen, die sie zu ihrer Ausführung benötigen. Das Entwerfen und Organisieren dieser Typen ist die wesentliche Arbeit, die bei der Entwicklung einer Anwendung in C# geleistet wird.

Zusammenfassend heißt das auf der einen Seite, dass alles, was sich oberhalb einer Assembly befindet, zwar zu der Ausführung einer Anwendung benötigt wird, aber letztlich auch nur die Ausführung sowie die Verteilung der Anwendung betrifft. Insbesondere wird all dies nicht in C# umgesetzt, da dort nur noch ausführbare Dateien gehandhabt werden, und man, wenn überhaupt, nur mit MSIL - nicht aber mit C# - in Berührung kommt.

Auf der anderen Seite wird im Gegenzug alles, was sich unterhalb einer Assembly befindet, in C# umgesetzt. Das heißt, Anwendungen zu entwickeln bedeutet im wesentlichen, Datenstrukturen zu modellieren, sie zu organisieren und darauf basierend die Verfahren aufzubauen, die mit diesen Datenstrukturen arbeiten.