Frage

Ich möchte Module meines Programms trennen, um miteinander zu kommunizieren. Sie könnten auf demselben Computer sein, aber möglicherweise auf anderen.

Ich dachte über 2 Methoden nach:

  1. Erstellen Sie eine Klasse mit allen Details. Senden Sie es an die Kommunikationsschicht. Dieser serialisiert es, sendet es, die andere Seite deserialisiert es zurück in die Klasse und behandelt es weiter.
  2. Erstellen Sie ein Hashtable (Schlüssel/Wertsache). Geben Sie alle Daten darin ein. Senden Sie es an den Kommunikationslayer usw. usw.

Es läuft also auf Hashtable vs -Klasse hinaus.

Wenn ich "lose gekoppelt" denke, bevorzuge ich Hashtable. Es ist einfach, ein Modul aktualisiert zu haben, neue zusätzliche Parameter in die hastable aufzunehmen, ohne die andere Seite zu aktualisieren.

Wieder mit einer Klasse erhalte ich mit einer Überprüfung des Kompilierungs-Zeit-Typs statt Laufzeit.

Hat jemand dies zuvor angegangen und hat Vorschläge dazu?

Vielen Dank!

Bearbeiten: Ich habe Punkte für die Antwort vergeben, die für meine ursprüngliche Frage am relevantesten war

War es hilfreich?

Lösung

Man neigt dazu, diese Art von Problem im Distributed Systems Design zu treffen. Es taucht im Webdienst auf (die WSDL-definierende Messaging-Systeme und Rückgabetypen), bei denen die Formate von Nachrichten XML oder ein anderes gut definiertes Format ausmachen können. Das Problem der Kontrolle der Kopplung von Client und Server bleibt in allen Fällen bestehen.

Was passiert mit Ihrem Hash -Tisch? Angenommen, Ihre Anfrage enthält "Name" und "Telefonnummer", und plötzlich merkt Sie, dass Sie "Festnetznummer" und "Zellennummer" unterscheiden müssen. Wenn Sie nur die Hash -Tabelleneinträge ändern, um neue Werte zu verwenden, muss sich Ihr Server gleichzeitig ändern. Angenommen, Sie haben zu diesem Zeitpunkt nicht nur einen Client und einen Server, sondern haben sich möglicherweise mit einer Art Exchange- oder Broker -Systemen befasst, viele Clients, die von vielen Teams implementiert wurden, viele Server, die von vielen Teams implementiert wurden. Es ist ein ziemliches Unterfangen, alle gleichzeitig auf ein neues Nachrichtenformat zu aktualisieren.

Daher neigen wir dazu, nach Hintergrundlösungen wie zu suchen, wie z. Zusatzstoff Wechseln Sie, erhalten Sie "Telefonnummer" und fügen die neuen Felder hinzu. Der Server toleriert jetzt Nachrichten, die entweder altes oder neues Format bestehen.

Unterschiedliche Verteilungstechnologien haben unterschiedliche Eingrenzungsgrade der Toleranz für die Rückkompatibilität. Können Sie sich im Umgang mit serialisierten Klassen mit alten und neuen Versionen umgehen? Wenn die Meldungsparsers additive Veränderungen tolerieren, tolerieren die Nachrichtenparser.

Ich würde den folgenden Prozess folgen:

1). Haben Sie eine einfache Beziehung zwischen Client und Server, z. B. codieren und kontrollieren Sie beide frei, um ihre Release -Zyklen zu diktieren. Wenn "Nein", dann Flexibilität bevorzugen, verwenden Sie Hash -Tabellen oder XML.

2). Auch wenn Sie die Kontrolle haben, betrachten Sie, wie einfach Ihr Serialisierungsrahmen die Versionierung unterstützt. Es ist wahrscheinlich, dass eine stark typisierte, serialisierte Klassenschnittstelle einfacher zu arbeiten ist, vorausgesetzt, Sie haben ein klares Bild davon, was sie benötigen, um die Schnittstelle zu ändern.

Andere Tipps

Es hört sich so an, als ob Sie einfach etwas einbauen möchten IPC (Kommunikation Inter-Process) in Ihr System.

Der beste Weg, dies in .NET (ab 3.0) zu erreichen, ist mit dem Windows Communication Foundation (WCF) - Ein generisches Rahmen, das von Microsoft für die Kommunikation zwischen Programmen in verschiedenen Manieren (Transporten) auf einer gemeinsamen Basis entwickelt wurde.

Obwohl ich vermute, dass Sie wahrscheinlich verwenden wollen benannte Pfeifen Für Effizienz und Robustheit stehen eine Reihe anderer Transporte wie TCP und HTTP zur Verfügung (siehe Dieser MSDN -Artikel), ganz zu schweigen von einer Vielzahl von Serialisierungsformaten von Binär bis XML bis JSON.

Sie können Sockets, Remoting oder WCF verwenden, Eash hat Vor- und Nachteile.

Wenn die Leistung jedoch nicht von entscheidender Bedeutung ist, können Sie WCF und serialisieren und deserialisieren Sie Ihre Klassen. Für maximale Leistung empfehle ich Sockets

Was ist jemals mit der gebauten Unterstützung für das Remoting passiert?

http://msdn.microsoft.com/en-us/library/aa185916.aspx

Es funktioniert auf TCP/IP oder IPC, wenn Sie möchten. Es ist schneller als WCF und ist für Ihren Code ziemlich transparent.

Nach unserer Erfahrung haben wir in den letzten Jahren in den letzten Jahren mit verschiedenen Bindungen nicht den Aufwand wert.

Es ist nur kompliziert, WCF korrekt zu verwenden, einschließlich der korrekten Handhabungsfehler auf Kanälen, während wir eine gute Leistung beibehalten haben (wir haben mit WCF frühzeitig die hohe Leistung aufgegeben).

Für authentifizierte Client -Szenarien haben wir zu HTTP REST (ohne WCF) gewechselt und JSON/Protobuf -Payloading durchgeführt.

Für nicht authentifizierte Hochgeschwindigkeitsszenarien (oder zumindest nicht kerberos authentifizierte Szenarien) verwenden wir jetzt Zeromq und Protobuf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top