2012-08-31 13 views
7

今、私はアプリケーションをコーディングしています。私が今やっていることをより良い解決策にしなければならないと考えています。c#クラス間の通信に最適な方法

私はプログラムの設定を処理するメインウィンドウを持っています。それから私はさらにクラスと窓を持っています。たとえば、言語ハンドラクラスと "main関数"に必要なユーザ入力を処理するフォーム。

しかし、これまでは、言語ハンドラがメインウィンドウの文字列を変更できるようになるまで、私は常にこのクラスのそれぞれにメインウィンドウを渡す必要がありました。また、もう一方のフォームでは、メインウィンドウにデータを渡すことができます。

もっとクラスがあり、すべてのクラスにメインウィンドウのコピーが必要であると想像すれば、これはメインウィンドウの「サイズ」に応じて多くのリソースを消費します。

したがって、これらのクラス間で通信するためのより良い/より効率的な方法があります。

+3

[参照型と値型](http://www.albahari.com/valuevsreftypes.aspx)を参照し、メインフォームを渡すことについて心配しないでください。参照型。 –

+0

誰にもThx。うわー、私はそれが参考として渡されたことを知っていたはずです。しかし、私はあなたのすべてのアドバイスを見ています;) –

答えて

9

これを行う一般的な方法はobserver patternです。これは.NETでevents systemです。簡単に言えば、クラスはお互いのイベントを購読し、イベントが発生したときにアクションを実行します。コメントに記載されているように、参照を渡すことはメモリが重いわけではありませんが、コードの異なる部分の間に密接な結合が生じます。私たちはこれらすべての用語ずに、より高いレベルのビューを見れば

イワンによって与えられたANSに加えて
2

GalasoftまたはPrism MVVMの実装を使用することをお勧めします。そこでは、使いやすいメッセージングサービスを使用することができます。情報を必要とするクラスは、加入者にメッセージを送信するだけで、必要なすべてのデータを送信することができます。私はこれがコミュニケーションを処理する最も簡単な方法だと思います。

2

...あなたはおそらく情報に
これを保存することでフィールドを定義する場合と、サーバーInMemoryStorageなどと静的クラスを作成する必要があります共有されているものを完全に制御し、複数のコンポーネントがそれを変更できるようにする
また、プロパティやプロパティが変更されるたびにイベントを発生させて、さまざまなフォームやウィンドウ(ビュー)それに応じて行動してください

3

もう一つの選択肢は、クラスをサービスとして考えることです。それらをインターフェイスにコード化し、オブジェクトグラフを構築するためにdependency injection(別名Inversion of Control)を使用します(あなたはfrmSomethingが必要なIoCコンテナに指示し、必要なサービス/クラスを決定し、適宜インスタンス化します)。

これはことを意味します

  • はあなたしかあなたのコードが緩く(あなたがNewTranslatorためOldTranslatorを交換している限り、彼らは両方の遵守とすることができます結合されているインタフェースではない実装
  • に対してコーディングする必要が同じインターフェースに変更する必要はありません。
  • まだ書かれていないサービスに依存する高水準な機能を開発し、コードをコンパイルすることができます。
  • 必要に応じて実行時にコンテナに登録されているクラスやサービスを変更することで、アプリケーションの動作方法を非常に簡単に変更できます。

MSサポートDIコンテナについては、Unityをご覧ください。 Castle Windsorは一般的な選択肢ですがもっと多くあります

あなたが言ったように、メインウィンドウの「コピー」を渡すことは悪いことではありません。 ポインタ)をメインウィンドウに追加します(実際のプリミティブよりも複雑なものは参照型です)。これは、オーバーヘッドがごくわずかであることを意味します。

関連する問題