2009-08-16 11 views
2

私のプログラムのモジュールを分離してお互いに通信したいと思います。それらは同じコンピュータ上にあっても、異なるコンピュータ上にあってもよい。.NET内のプログラム間の通信

  1. は、すべての詳細を持つクラスを作成します。

    は、私は2つの方法を検討していました。それを通信レイヤーに送ります。これはシリアル化して送信し、もう一方のサイドはクラスに逆シリアル化し、さらに処理します。
  2. ハッシュテーブル(キー/値のもの)を作成します。すべてのデータを入れてください。コミュニケーション層などに送ってください。

これは、ハッシュテーブル対クラスです。

私が「疎結合」と考えると、私はハッシュテーブルを好む。 1つのモジュールを更新し、もう一方のパラメータを更新することなく、新しい余分なパラメータをhastableに組み込むのは簡単です。

次に、クラスを使用して、実行時ではなくコンパイル時の型チェックを取得します。

これまで誰もがこれに取り組んできましたが、これについての提案はありますか?

ありがとうございます!

編集: それはupvotedしたものではありませんが、私は、私の元の質問に最も関連した答えにポイントを獲得した中で最も

+0

個人的に私は別のクラスに行きたいと思いますが、ここでの主なコメントは、「シリアライズ」と「デシリアライズ」の使用方法を修正し、それらを切り替え、シリアライズをオブジェクトに適用してデータを生成し、データからのオブジェクト –

+0

あなたは正しい...私の悪い; ^) – Toad

答えて

2

分散システム設計でこのような問題が発生する傾向があります。これは、Webサービス(パラメタと戻り型を定義するWSDL)にあります。メッセージの形式がXMLまたはその他の明確な形式であるメッセージングシステム。クライアントとサーバーの結合を制御する問題は、すべての場合に残っています。

ハッシュテーブルはどうなりますか?あなたのリクエストに "NAME"と "PHONE-NUMBER"が含まれていて、 "LANDLINE-NUMBER"と "CELL-NUMBER"を区別する必要があることが突然分かりました。新しい値を使用するようにハッシュテーブルのエントリを変更するだけであれば、サーバーは同時に変更する必要があります。この時点では、クライアントとサーバーが1つだけではなく、何らかの種類の交換またはブローカーシステム、多くのチームによって実装される多くのクライアント、多くのチームによって実装される多くのサーバーなどを扱っているとします。同時に新しいメッセージ形式にアップグレードするようにそれらのすべてに依頼することは、かなりの仕事です。

したがって、我々はのような逆コンパチブルソリューションを探す傾向があります。の変更、 "PHONE-NUMBER"を保存して新しいフィールドを追加します。サーバーは古い形式または新しい形式のメッセージを許容します。

さまざまな配布テクノロジには、互換性のために異なる組み込み許容レベルがあります。シリアライズされたクラスを扱う場合、古いバージョンと新しいバージョンを扱うことができますか? WSDLを扱う場合、メッセージパーサーは追加的な変更を許容しますか?

私は以下のプロセスに従います:

1)。クライアントとサーバーの間には単純な関係がありますか?たとえば、両方をコード化して制御するなど、リリースサイクルを自由に決めることができます。 "いいえ"の場合は、柔軟性を優先し、ハッシュテーブルまたはXMLを使用します。

2)。たとえあなたがコントロールしていても、シリアライゼーションフレームワークがバージョン管理をどれほど容易にサポートしているかを見てください。インターフェースに変更を加えるためにどのようなことが起こるのかをはっきりと把握していれば、強く型付けされたシリアライズされたクラスのインターフェースは使いやすくなりそうです。

+0

あなたは何らかの種類のバージョン管理を処理する必要があります。これは、ハッシュテーブルがこれより簡単であるように思えます。ただ1つの余分なフィールド 'バージョン'があり、受信側の当事者はどのようなパラメータを期待できるのかを知っています。 – Toad

4

あなたは、単にいくつかのIPC (Inter-Process Communication)を組み込みたいように聞こえますシステムにインストールします。

.NETでこれを達成する最良の方法は、Windows Communication Foundation (WCF) - 一般的なさまざまな方法(トランスポート)でプログラム間の通信のためにMicrosoftによって開発された汎用フレームワークです。私はあなたがおそらく効率性と堅牢性の目的のために名前付きパイプを使用したいと思うでしょう疑いが

は、直列化の多様性を言及しないように、利用可能なTCPおよびHTTP(this MSDN articleを参照)などの他のトランスポートの数がありますバイナリからXML、JSONへのフォーマット

+0

私はこの技術に終止符を打てるかもしれない。しかし、プリベーキングされたソリューションを使用する前に、最初にフレームワークを作成したいと思っています。私のやり方はおそらくjsonを使ってtcp-ip/httpになるでしょう(名前付きパイプはマシン境界を越えていません) – Toad

+0

@reinier:十分に公正です。その場合は、シンプルなシリアライゼーション形式(組み込みのバイナリ/ XMLフォーマッタまたはプロトコルバッファ)を使用し、このデータをTCP経由で送信することをお勧めします。すぐに、既存のフレームワークを使用するのが最善の理由がわかります。 :)しかし、ええ、それを理解すると助けになるかもしれません。また、ネットワーク上の異なるコンピュータ間に名前付きパイプが存在する可能性があります。たとえば、これを参照してください:http://stackoverflow.com/questions/244367/c-3-5-connecting-named-pipe-across-network – Noldorin

+1

名前付きパイプについては確かですか? msdnリファレンスは、共有メモリを使用するプロセス間通信のためのものであると言います。別のマシンではどうすればいいですか? http://msdn.microsoft.com/en-us/library/aa365780(VS.85).aspx – Toad

0

Remotingの組み込みサポートには何が起こったのですか?

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

したい場合は、TCP/IPまたはIPC上で動作します。 WCFよりも速く、コードにはかなり透過的です。

+0

いつでも他のシステムや言語とのコミュニケーションを加えたいと思ったら、内部でどのように動作するのかを理解するために深く掘り下げて考える必要があります。私が何かを自分で設計したら、もう一度やり直すつもりですが、少なくとも私はそれから学び、どのように、なぜそれが働くのか、どうしてなぜ特定の決定が下されたのかを知るでしょう。とにかく、...あなたの答えは実際にハッシュテーブル対クラスについて私の質問に答えていない – Toad

+1

WCFは.NET 2.0リモーティングの後継であり、より完全で現代的なフレームワークであることに加えて、私はそれが遅く実行されるとは思わない。私はこれについていくつかの証拠を見たいと思います。 – Noldorin

0

あなたはSockets、Remoting、またはWCFを使用できます。eashには長所と短所があります。

しかし、パフォーマンスはあなたが我々がWCFを見られる様々なバインディングで過去数年にわたって広範囲にWCFを使用して我々の経験では

+0

入力していただきありがとうございますが、あなたの答えは実際にハッシュテーブル対クラスについての私の質問に答えていません – Toad

-1

をWCFを使用して、あなたのクラスをシリアライズし、デシリアライズし、最大のパフォーマンスのために、私はソケットをお勧めすることができ、決定的なものではない場合面倒なことに値するものではありません。

良いパフォーマンスを維持しながらチャンネルの処理エラーを含め、WCFを正しく使用することはちょっと複雑になります(wcfで早く高性能をあきらめました)。

認証されたクライアントのシナリオでは、http rest(wcfなし)に切り替えてjson/protobufペイロードを行いました。

高速で認証されていないシナリオ(または少なくともケルベロス認証されていないシナリオ)では、zeromqとprotobufを使用しています。