Question

J'ai frappais ma tête à essayer de comprendre certaines choses. Donc, je suis à la recherche de conseils et de matériel de recherche (via des liens). Voici le scénario:

Nous avons une bibliothèque (disons, CommonLib) qui contient des ressources nécessaires par plusieurs autres applications (par exemple, AppA, AppB, APPC, et ainsi de suite ...). Maintenant, la façon dont cela fonctionne actuellement est des instances de l'APPA, vérifie si le port spécifique est disponible. Dans le cas contraire, il donne le coup CommonLib ( « Hey, réveille-toi ») et le service est démarré. Alors AppA est heureux et nous voilà partis.

Maintenant, je l'ai fait beaucoup de recherches sur Remoting.Channels et je suis venu à la conclusion que je commence une application construite sur une technologie qui est considéré comme « héritage ». Eh bien ... Je ne l'aime pas. Honnêtement, WCF est bien plus frais généraux que nous avons besoin et non entièrement mises en application en Mono. Nous visons une compatibilité multi-plateforme (Windows, Mono, Linux) donc nous recherchons toutes les options.

L'idée de Remoting a commencé, en premier lieu, parce que nous voulions CommonLib être une instance unique garantie (si je comprends bien, un singleton est à peu près garanti que d'être un singleton dans un AppDomain donné - ne hésitez pas à corriger moi si je me trompe). Quoi qu'il en soit, je me suis rendu la puissance de Remoting et a décidé de commencer une mise en œuvre expérimentale. J'ai réussi à mon utilisation initiale du MarshalByRefObject. Mais, je suis préoccupé par la mise en œuvre continue de cette technologie héritée.

Alors, avec tout cela ... Je considère comment je peux mettre en œuvre CommonLib (comme application hôte) et, sans Remoting, mettre en œuvre MarshalByRefObject par le courant standard TCP Socket, ou d'une autre manière. Ce que je pense est, au lieu de l'instanciation AppA pour obtenir CommonLib en cours d'exécution, tout mettre en œuvre CommonLib que l'application de base. Ensuite, vous sélectionnez ce que l'application (vraiment juste un « hébergé » .dll) que vous voulez instancié dans les CommonLib. CommonLib serait alors charger que .dll dans le cadre CommonLib ainsi que quelles que soient les contrôles personnalisés qui abritaient les utilisations de l'application. Avec cette idée, je renoncer à l'exigence (pour l'instant) que CommonLib doit être un singleton authentique.

Alors ... qui est un détail de notre scénario. Encore une fois, ma question est vraiment 2 parties: (a) Quelle technologie (s) dois-je la recherche, et (b) Ai-je besoin de se préoccuper de l'état de l'héritage de la technologie d'accès distant

?

Les autres conseils, des commentaires ou des questions sont plus que bienvenus.

Mise à jour 1: Je suis à commencer par cet extrait . Cela me permettra de charger un fichier (ou script) avec une liste d'applications (ou plug-ins) qui ont été installés. Je peux créer ce fichier au format XML ou au format binaire. Lorsqu'une nouvelle application est installée, le fichier et chemin peuvent être ajoutés. Hmmm ... Je ne dois pas nécessairement utiliser MarshalByRefObject.

Était-ce utile?

La solution

Alors que WCF ne peut pas être complet Mono, Mono 2.6 fournit tout le nécessaire pour silverlight / clair de lune, donc une implémentation basée sur WCF doit être parfaitement réalisable. Tant que vous ne cherchez rien exotiques (Transports différents, inspecteurs, etc.), il devrait être plus que suffisant pour fournir une pile de RPC qui est fiable entre les fenêtres / mono / etc.

La principale différence entre WCF et la communication à distance se trouve dans utilisation - communication à distance est basé abondent un objet qui prétend être à une extrémité différente, où, comme WCF est basé autour d'un service; le point étant que vous devez baser vos interactions autour de méthodes discrètes (plutôt que l'accès à des propriétés, etc.) - ce qui a également l'avantage d'aider le rendant explicite lorsque vous traversez la frontière

Une autre option serait d'écrire un serveur socket très basique; très léger, et vous pouvez utiliser quelque chose comme protobuf net pour fournir une implémentation de sérialiseur portable (multi-plateforme) (vous ne devriez pas vraiment faire confiance BinaryFormatter entre les deux - il est ... flakey).

En bref - Je ne voudrais pas construire autour MarshalByRefObject tout ; Je voudrais écrire une couche de service, quelque chose comme:

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

et abstraite ces détails loin de l'appelant. Si vous vous retrouvez à l'aide de WCF, alors c'est tous vous avez besoin; et pour le soutien de Remoting existant Je voudrais écrire une implémentation IMyService que encapsule (privé) toute l'histoire de MarshalByRefObject. Même chose si je l'ai écrit un serveur socket.

Autres conseils

Je ne suis pas sûr que .NET Remoting est rendue obsolète par WCF. Je pense qu'ils ont quelque peu différents cas d'utilisation; WCF (délibérément) n'a pas de concept de « maréchal par renvoi », car il est conçu pour distribuer et (relativement) des applications faiblement couplées qui pourraient avoir besoin d'éviter des protocoles bavardes dus à la latence, etc. Si vos composants sont couplés naturellement étroitement, la latence sera faible mais la performance doit être élevé, riches en préservant les types .NET est important, etc. alors Remoting peut encore être un bon ajustement. Quoi qu'il en soit, je ne vous inquiétez pas d'être des technologies « héritage », « héritage » au moins sous Windows / .NET ont une façon de rester autour depuis un certain temps si elles obtiennent une bonne quantité d'utilisation. Remoting existe encore dans la version la plus récente (4.0) de .NET.

Rien de tout cela est conçu comme une affirmation selon laquelle Remoting nécessairement est la meilleure solution pour votre situation ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top