0

私はagsXMPPライブラリを使用してXMPPに基づくMicrosoftWPFインスタントメッセージアプリケーションを開発しています。agsXMPPには、OnXmppConnectionStateChanged、OnLogin、OnPresenceなどの多くのイベントがありますが、WPFスレッドモードのため、UIのDispatcher.Invoke()メソッドを介してイベントを処理する必要があります。これは次のようになります。

    void handleRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item)
    {
        STP_FriendsHolder.Dispatcher.BeginInvoke(new Action(delegate
        {
            RosterItemControl rosterItem = new RosterItemControl();
            rosterItem.RosterItemName = item.Jid.User;
            rosterItem.Margin = new Thickness(0);
            STP_FriendsHolder.Children.Add(rosterItem);
        }));
    }

私はほとんどすべてのBeginInvoke/Invokeメソッドで匿名メソッドを使用しています。これは、どこにでもあまりにも多くの名前付きメソッドを作成したくないためです(これはそれほど「クリーン」ではないと思うため)。しかし、私はそれがOOPの方法ではそうではないのではないかと心配しており、これらの匿名の方法を維持することは非常に困難です。それで、どうすればこの状況でより良い方法でコーディングできますか?英語が下手でごめんなさい、はっきりさせたいと思います^ _ ^ありがとう!</ p>

4

2 に答える 2

1

どこにでもあまりにも多くの名前付きメソッドを作成したくないからです

では、BeginInvoke / Invokeコードを再利用したくないですか?それはまったく問題ありません。

私は「きれいな」コメントに反対しますが。

どちらがきれいですか?どちらが読みやすいですか?これ...

    STP_FriendsHolder.Dispatcher.BeginInvoke(new Action(delegate
    {
        RosterItemControl rosterItem = new RosterItemControl();
        rosterItem.RosterItemName = item.Jid.User;
        rosterItem.Margin = new Thickness(0);
        STP_FriendsHolder.Children.Add(rosterItem);
    }));

...またはこれ?

    STP_FriendsHolder.Dispatcher.BeginInvoke(AddRosterItem);


    void AddRosterItem()
    {
        RosterItemControl rosterItem = new RosterItemControl();
        rosterItem.RosterItemName = item.Jid.User;
        rosterItem.Margin = new Thickness(0);
        STP_FriendsHolder.Children.Add(rosterItem);
    }
于 2012-05-31T14:52:34.000 に答える
0
  1. コードビハインドクラスでXMPPイベントを処理することはありません。イベントの処理のみを担当するクラスを作成します。
  2. このクラスがXMPPイベントを変換するためのすてきなクリーンなメソッドで使用するインターフェイスを作成します。NewRosterItem(RosterItem item)
  3. ディスパッチャを呼び出してこれらのメソッドを呼び出します(つまり、イベントを処理するクラスにのみBeginInvokeをカプセル化します。
  4. ビューにインターフェイスを実装してイベント処理クラスに登録してもらうと、必要なコントロールを作成および更新できます。
于 2012-05-31T15:15:49.930 に答える