This project has moved. For the latest updates, please go here.

Erste Schritte

Architektur einer Zyan-Anwendung

Im einfachsten Fall besteht eine Zyan-Anwendung aus einem Client und einem Server. Der Server bietet bestimmte Dienstleistungen in Form von Komponenten an, welche der Client über ein Netzwerk aufrufen kann. Als Komponente kann jede beliebige .NET Klasse verwendet werden. Die Komponenten leben auf dem Server und auch deren Assemblies sind nur dem Server bekannt. Der Zugriff vom Client aus wird über einen sog. Proxy (Stellvertreter-Objekt) abgewickelt. Ein Proxy ist ein Objekt, welches Methodenaufrufe annimmt, aber diese sofort übers Netzwerk an die eigentliche Komponente auf dem Server weiterleitet. Damit das funktionieren kann, benötigt der Proxy die Schnittstelle (also welche Methoden die Klasse hat und was für Parameter und Rückgabetypen diese haben) der Komponente auf dem Server. Deshalb muss für jede Klasse, die über Zyan als Komponente veröffentlich werden soll, eine Schnittstelle (Interface) vorhanden sein. Da die Schnittstellen der Komponenten sowohl dem Server als auch dem Client bekannt sein müssen, werden sie in separate Assemblies gepackt. Eine Zyan-Anwendung besteht deshalb in einfachsten Fall aus drei Assemblies (bzw. drei Visual Studio-Projekten).

Assemblyverwendung Beschreibung
Client-Assembly Enthält den Quellcode der Client-Anwendung (z.B. Formulare etc.)
Shared-Assembly Enthält Schnittstellen der veröffentlichten Serverkomponenten und ggf. andere gemeinsam genutzte Typen
Server-Assembly Enthält die Host-Logik und die Komponentenimplementierungen


Wichtig! Sowohl Client als auch Server benötigen einen Verweis auf die Assembly Zyan.Communication.dll, damit die Kommunikation über Zyan funktionieren kann!

Komponente erstellen

Eine Komponente ist eine ganz gewöhnliche .NET-Klasse, die eine Schnittstelle implementiert. Komponenten können im Client oder Server-Prozess laufen. In den meisten Fällen laufen Komponenten serverseitig und Clients konsumieren sie über die öffentliche Schnittstelle. Dabei liegt die Komponenten-Implementierung (die Klasse) in einer Assembly auf dem Server und die öffentliche Schnittstelle, die sie implementiert, in einer separaten Shared-Assembly, die Server und Client gemeinsam benutzen. Sowohl Client- als auch Server-Assembly benötigen einen Verweis auf die Shared-Assembly (denn nur, was man kennt, kann man auch aufrufen).

Folgendes Listing zeigt eine ganz einfache Komponente:
namespace EchoExample.Server
{
    public class EchoComponent : IEchoComponent
    {
        public string Echo(string message)
        {
            return message;       
        }
    }
}
Und hier die passende Schnittstelle dazu:
namespace EchoExample.Shared
{
    public interface IEchoComponent
    {
        string Echo(string message);
    }
}  

Mehr ist nicht nötig. Die Komponente EchoComponent kann nun für den Netzwekzugriff veröffentlicht werden.
Tipp: Wenn Sie eine vorhande Klasse als Komponente veröffentlichen möchten, die keine Schnittstelle implementiert, können Sie von dieser Klasse ableiten und in der abgeleiteten Klasse eine Schnittstelle implementieren.

Komponente veröffentlichen

Damit vom Client aus Methoden einer Komponente, übers Netzwerk aufgerufen werden können, muss die Komponente zuerst auf dem Server veröffentlichen. Man nennt das auch "hosten". Um Komponenten hosten zu können, muss ein ZyanComponentHost-Objekt erstellt werden. Dieses Objekt kümmert sich um die serverseitige Kommunikation (z.B. auch öffnen und schließen von Sockets, wenn diese beötigt werden). Mit einer einzelnen ZyanComponentHost-Instanz können beliebig viele Komponenten gehostet werden. Dem Konstruktor wird ein eindeutiger Name, die Netzwerkanschlußnummer (Port) und ein Objekt mit Konfigurationseinstellungen für das Netzwerkprotokoll (ein sog. ProtocolSetup) übergeben.
Zyan bringt verschiedene ProtocolSetups mit. Diese sind im Namensraum Zyan.Communication.Protocols zu finden. Für ein Netzwerkprotokoll (z.B. HTTP oder TCP) können jeweils mehere ProtocolSetups vorhanden sein. Zur besseren Überischt gibt es pro Netzwerkprotokoll einen separaten Namensraum. Die ProtocolSetups für TCP sind z.B. im Namensraum Zyan.Communication.Protocols.Tcp und die für HTTP im Namensraum Zyan.Communication.Protocols.Http zu finden.
Über das ProtocolSetup werden folgende Kommunikations-Einstellungen festgelegt:
  • Netzwerk-Anschlußnummer (Port; z.B. standardmäßig 80 bei HTTP)
  • Authentifizierungsanbieter (Bestimmt, wie Benutzer authentifiziert werden soll)
  • Einstellungen zur Verschlüsselung und zur Kommunikationssicherheit generell

Im Kapitel Kommunikationsprotokolle konfigurieren erfahren Sie mehr über ProtocolSetups und die Konfiguration von Zyan im Allgemeinen.

Das folgende Listing hostet die EchoComponent von oben und verwendet HTTP (Port 8080) mit aktivierter Verschlüsselung aber ohne Authentifizierung:
using Zyan.Communication;
using Zyan.Communication.Security;
using Zyan.Communication.Protocols.Http;

...

HttpCustomServerProtocolSetup protocolSetup = new HttpCustomServerProtocolSetup(8080, new NullAuthenticationProvider(), true);
ZyanComponentHost host = new ZyanComponentHost("EchoExample",protocolSetup);

host.RegisterComponent<IEchoComponent,EchoComponent>(ActivationType.SingleCall);

Das war´s soweit erstmal auf der Serverseite! Der Applikationsserver für die erste Zyan-Anwendung steht.

Hinweis: Es bringt nichts, den URL im Webbrowser einzugeben. Zyan generiert weder WSDL noch sonstige Metadaten. Da der Client über die Shared-Assembly verfügt, ist das auch gar nicht nötig. Mit Zyan veröffentlichte Komponenten können nicht über den Webbrowser getestet werden. Sie müssen eine Client-Anwendung schreiben, um die Komponente aufrufen zu können.

Komponente von einem Client aus konsumieren

Um von einer Client-Anwendung aus Komponenten aufrufen zu können, die mit Zyan veröffentlicht wurden, muss zuerst eine Verbindung zum entsprechenden Server hergestellt werden. Darum kümmert sich die Klasse ZyanConnection. Die Verbindungsherstellung funktioniert ganz ähnlich, wie z.B. in ADO.NET (Dort wird die SqlConnection-Klasse verwendet, um eine Verbindung zum Datenbankserver herzustellen). In einer Zyan-Clientanwendung stellt die Klasse ZyanConnection eine Verbindung zu einem bestimmten Zyan-Komponentenhost her. Beim erzeugen einer neuen ZyanConnection, muss der URL zum gewünschten Server und ein passendes ProtocolSetup übergeben werden.

Folgender Code stellt eine verschlüsselte Verbindung zur zuvor veröffentlichten EchoComponent über HTTP auf Port 8080 her, erzeugt einen Proxy und ruft die Methode Echo auf:
using Zyan.Communication;
using Zyan.Communication.Protocols.Http;

...

HttpCustomClientProtocolSetup protocolSetup = new HttpCustomClientProtocolSetup(true);
ZyanConnection connection =new ZyanConnection("http://localhost:8080/EchoExample", protocolSetup);

IEchoComponent proxy = connection.CreateProxy<IEchoComponent>();

string result = proxy.Echo("Hallo Welt");
Der erzeugte Proxy fühlt sich an, wie die echte EchoComponent, und verhält sich auch so. Nur dass die Echo-Methode im Beispiel hier nicht lokal im Client-Prozess aufgerufen wird, sondern auf der serverseitigen Komponente. Für die Verarbeitung der Logik in der entfernten Methode wid deshalb auch nicht die CPU des Client-Computers belastet, sondern die des Servers.

Wenn Sie anstatt "localhost" den Namen oder die IP-Adresse des Server-Computers einsetzen und Client-Anwendung sowie Server-Anwendung auf zwei verschiedenen Computern starten, haben Sie erfolgreich eine verteilte Anwendung erstellt, deren Komponenten übers Netzwerk miteinander kommunizieren.
Anmerkung: In einer realen Anwendung sollten Sie Anschlußnummern und Server-URLs niemals direkt im Quellcode hinschreiben, sondern diese Eigenschaften in eine Konfigurationsdatei oder die Windows-Registry auslagern.

Last edited Feb 19, 2012 at 10:24 AM by Rainbird, version 10

Comments

No comments yet.