2009-08-17 15 views
1

私はwinformsプロジェクトでCastle winformsを少し試していました。 Castle windsorにフォームの依存関係をすべて登録したかったのです。このようにして、私はすべてのフォームに対して1つのインスタンスを持つことになります。 今私はいくつかの問題があります。 私は、フォームxがフォームyに依存し、フォームyがフォームxに依存するという状況にあります。実際の例:城ウィンザーを使用したwinformsアプリの循環依存関係

フォームxは注文を作成するために使用され、フォームyは顧客のリストを持つ画面です。 フォームxから注文の顧客を選択するボタンがあります。これにより、ouが顧客を検索できるフォームyが開きます。見つかった顧客を注文に追加するためのボタンがあります。フォームxのメソッドを呼び出し、選択した顧客オブジェクトを渡します。私はイベントでこれを行うことができます。フォームyでイベントを発生させ、フォームxでイベントを待ち受けます。しかし、城ウィンザー、遅延登録や何かの循環依存を回避する方法はありませんか?

誰でもお手伝いできますか?事前

答えて

1

ありがとうございます一つの形態から別のものに緊密に結合し、ルートあなたのイベントを破るためにEventWiring facilityを使用することができます。

+0

これは実際には私のイベントをルーティングし、緊密に結合されていない良い方法ですが、私はただちにイベントに切り替えるかどうかわかりません。私のシナリオでイベントを使用するのは、アーキテクチャ上の優れた判断です。私は多くの異なる出来事で終わらないのですか?私がデッドロック状況を克服する方法を見つけて、formX.AddCustomerToOrder(Customer C)のようなメソッドを呼び出すと、私はもっと密接に結合されます。 – Sven

1

私が何をしたいことは、あなたが、あなたのプロジェクトがあるため、ヘッダーの優先順位をコンパイルしないと言ったことで推測フォーム

に前方参照であることを考える

あなたはそれが正確にあなたのプログラミング言語に依存書く方法

nullポインタ参照のために実行時に問題が発生した場合は、ロード中にすべてのフォームを初期化してからすべてを配線し、マネージャーに登録することができます。

+0

ヘッダーの優先順位はどういう意味ですか?あるコンポーネントを別のコンポーネントの前に登録すると、問題が解決するということを意味しますか? (それは働いていない、試してみたので)またはあなたはある時点で特定のフォームを登録することを意味しますか?もしそうなら、どこで、いつ正しい場所になるでしょうか? – Sven

3

とにかくフォームクラスを見て、それを呼び出す方法や使用方法を知ることは非常に難しいです。とにかく、それぞれのフォームのインターフェースを持っていると助かりました。ファクトリメソッドを使用して、各フォームの/ show/get_resultsを作成します。

インターフェイスの使用は、通常、循環依存関係に対処する通常の方法です。

+0

私はあなたが何を意味するか完全に理解していません。あなたはMVPパターンのようなものを使うことを提案していますか?返信ありがとう – Sven

+1

彼は、FormAの参照FromBを持つ代わりに、FormAの参照IFormBを持っていることを提案しています。ここで、IFormBには実際に必要なメソッドとプロパティのみが含まれています。 –

1

私は私の問題を解決するために以下を行いました。クリーンなデザインであるかどうかは分かりません。誰も私の方法について私にコメントを与えることができますか?

public static class FormManager 
{ 
    private static IWindsorContainer container; 
    public static void Init() 
    { 
     container = new WindsorContainer() 
      .Install(Configuration.FromXmlFile("windsor.config")); 

     IoC.Initialize(container); 
    } 

    public static T GetInstance<T>() 
    { 
     return container.Resolve<T>(); 
    } 
} 

今すぐフォームへの依存を必要とするすべてのフォームは、このようなインスタンスを取得します:

FormManger.GetInstance<FormX>(); 

は、これは私の循環依存関係の問題を解決しました。

これはきれいですか?

+0

これは問題ないようです。彼がやっていることを知っているような人は、http://tinyurl.com/ygd2wb5( "Service Locator/Facade"までスクロールダウン)と同じようにします。 – dummy

関連する問題