Frage

Ich habe meinen Kopf hämmern wurde versucht, einige Dinge herauszufinden. Also, ich bin auf der Suche nach Beratung und Forschungsmaterial (über Links). Hier ist das Szenario:

Wir haben eine Bibliothek (sagen wir, CommonLib), die von mehreren anderen Anwendungen benötigten Ressourcen enthält (etwa AppA, AppB, AppC, und so weiter ...). Nun wird die Art und Weise dies zur Zeit arbeitet, ist APPA Fällen überprüft, ob die spezifische Port verfügbar ist. Wenn dies nicht der Fall, dann schlägt es CommonLib ( „Hey, aufwachen“) und der Dienst gestartet wird. Dann AppA ist glücklich und los geht es.

Jetzt habe ich auf Remoting.Channels eine Menge Forschung getan, und ich bin zu dem Schluss gekommen, dass ich eine Anwendung auf einer Technologie gebaut bin ab, die berücksichtigt wird ‚Legacy‘. Nun ... ich mag das nicht. Ehrlich gesagt, WCF ist viel mehr Aufwand, als wir benötigen und nicht vollständig in Mono implementiert. Wir zielen Multi-Plattform-Kompatibilität (Windows, Mono, Linux), so dass wir alle Möglichkeiten erforschen.

Die Idee begann Remoting, in erster Linie, weil wir CommonLib wollte eine garantierte einzelne Instanz sein (wie ich es verstehe, ein Singleton ziemlich viel ist nur dann gewährleistet ein Singleton innerhalb einer bestimmten AppDomain sein - fühlen Sie sich frei, um eine korrekte mich wenn ich falsch liege). Wie dem auch sei, erkannte ich die Kraft der Remoting- und einige experimentelle Umsetzung beginnen entschieden. Ich habe in meinem ersten Einsatz des MarshalByRefObject erfolgreich. Aber ich bin besorgt über die weitere Umsetzung dieser Legacy-Technologie.

Also, mit all diesem ... Ich erwäge, wie ich umsetzen kann CommonLib (als Host-Anwendung) und ohne Remoting, implementieren MarshalByRefObject über Stream Standard TCP-Socket, oder auf andere Weise. Was ich denke, ist, statt AppA von Instancing CommonLib zum Laufen zu bringen, nur implementieren CommonLib als Basis App. Dann wählen Sie, was app (wirklich nur ein ‚Gastgeber‘ .dll) Sie innerhalb CommonLib instanziert werden sollen. CommonLib laden würde dann diese DLL in den CommonLib Rahmen zusammen mit dem, was benutzerdefinierte Steuerelemente, die App nutzt gehostet. Zusammen mit dieser Idee, würde ich die Forderung verzichten (bis jetzt), dass CommonLib eine echte Singleton sein muss.

So ..., die ein Detail unseres Szenarios ist. Auch hier ist meine Frage wirklich zwei Teilen: (a) Welche Technologie (n) sollte ich Forschung, und (b) Notwendigkeit Muss ich mit dem Erbe Status der Remote Technologie betroffen sein

?

Jede andere Beratung, Kommentare oder Fragen sind mehr als willkommen.

UPDATE 1: Ich fange ab mit diese Schnipsel . Dies ermöglicht es mir, eine Datei (oder Script) mit einer Liste der Anwendungen zu laden (oder Plug-In), die installiert wurde. Ich kann diese Datei erstellen, wie XML oder Binary formatiert. Wenn eine neue App installiert ist, kann die Datei & Pfad hinzugefügt werden. Hmmm ... Ich weiß nicht unbedingt MarshalByRefObject verwenden.

War es hilfreich?

Lösung

Während WCF kann nicht sein, als komplettes in Mono, Mono 2.6 bietet alles, was erforderlich ist für Silverlight / Mondlicht, so dass eine WCF-basierte Implementierung durchaus möglich sein sollte. Solange Sie nicht versuchen, etwas exotischen (verschiedene Transporte, Inspektoren usw.) sollte mehr als ausreichend sein, um einen RPC-Stack zu schaffen, die zwischen den Fenstern / mono / etc zuverlässig ist.

Der wesentliche Unterschied zwischen WCF und Remoting ist in Verwendung - Remoting gibt es zuhauf ein Objekt basiert, der vorgibt, an einem anderen Ende zu sein, wo-wie WCF um einen Dienst basiert; der Punkt ist, sollten Sie Ihre Interaktionen um diskrete Methoden (und nicht den Zugriff auf Eigenschaften usw.) stützen -. Dies hat auch den Vorteil, hilft die es explizit, wenn Sie die Grenze überqueren

Eine andere Möglichkeit wäre eine sehr einfache Socket-Server zu schreiben; sehr leicht, und Sie so etwas wie protobuf-net, um eine tragbare (Cross-Plattform) Serializer Implementierung nutzen könnten. (Sie sollten nicht wirklich Vertrauen BinaryFormatter zwischen den beiden - es ist ... flakey)

Kurz gesagt - ich würde nicht bauen um MarshalByRefObject an alle ; Ich würde einen Service-Layer schreiben, so etwas wie:

interface IMyService {
    void Method1();
    int Method2(string s);
}

und abstrakt diese Details vom Anrufer weg. Wenn Sie WCF am Ende mit, dann ist das alle Sie benötigen; und für Unterstützung remoting bestehenden würde ich eine IMyService Implementierung schreiben, dass verkapselt (privat), um die ganze MarshalByRefObject Geschichte. Das Gleiche gilt, wenn ich einen Socket-Server geschrieben.

Andere Tipps

Ich bin nicht sicher, dass .NET Remoting von WCF veralteter ist. Ich denke, sie etwas andere Anwendungsfälle haben; WCF (absichtlich) hat kein Konzept von „Marschall by reference“, weil es für die verteilte und (relativ) lose gekoppelte Anwendungen dass Macht Notwendigkeit zu vermeiden, gesprächig Protokolle angefertigt aufgrund Latenz etc. Wenn sind natürlich Ihre Komponenten eng miteinander gekoppelt, Latenz gering sein wird, aber Leistungsanforderungen hoch, die Erhaltung reichen .NET-Typs ist wichtig, usw. dann kann noch Remoting eine gute Passform sein. Wie auch immer, ich würde nicht Sorge über „Legacy“, „Legacy“ Technologien zumindest unter Windows sein / .NET eine Möglichkeit hat, zu bleiben, um für einige Zeit, wenn sie einen angemessenen Betrag der Nutzung bekommen. Remoting noch existiert in der aktuellen (4.0) Version von .NET.

Nichts von alldem ist als Anspruch gemeint, dass Remoting notwendigerweise is die beste Lösung für Ihre Situation ...

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