1

職場では、私が維持する製品には多くの「可動部分」があります。その設計方法に関する主な問題点の 1 つは、リスト内の新しい項目が選択されたことを 10 か所の異なる場所で知る必要があるということです。直接コードパスをコーディングする必要があります。たとえば、次のレイアウトで。

                          Form1
                            |
        +-------------------+---------------------+
        |                   |                     |
     Control1            Control2              Control3
        |                   |                     |
        |             +-----------+          +----+----+
        |             |           |          |         |
SelectionList       View1       View2      View3     View4

(私が取り組んでいる実際のアプリケーションには、GUIコンポーネント用にこれよりも多くのレイヤーがあります...ブレ...)

コントロールに別のビューを追加する場合は、選択されている項目によって異なりますが、Form1 はメッセージをルーティングする必要があります。さらに悪いことに、選択リストまたはいずれかのビューから、選択したアイテムに対して呼び出すことができるさまざまなコマンドを追加すると、アクションを適切に呼び出すために、ビューを変更する必要があります。通常、そのようなアクションは Form1 に格納されています (メイン メニュー オプションからも利用できます...)。

(ファイルのリストのように SelectionList を考えてください...)

これは壊れやすく扱いにくいようです。

最近私は、イベント (コマンドなど) のパブリッシャーとサブスクライバーがイベント引数の定義とイベントを受け取るためのイベントの名前。

私の質問は次のとおりです。

  1. .Net 3.5 で既にこれを行っている商用、オープンソース、またはパブリック ドメインのライブラリはありますか? (私は C# を使用します。) これはアプリケーション内メカニズムである必要があります。MSMQ やThis Codeplex プロジェクトなどのインターアプリケーション ライブラリとメカニズムについては既に知っています。

  2. このようなソリューションを開発または使用した経験がある場合、回避すべき上位 3 つの落とし穴は何ですか?

4

2 に答える 2

1

Prism ( http://www.codeplex.com/compositewpf ) を見てみましょう。これにはEventAggregatorサービスが含まれており、必要なことをほぼ正確に実行します。EventAggregator は WPF に限定されているわけではありませんが、複合 UI は限定されています。

于 2009-12-05T23:50:12.410 に答える
1

これは軽量のメッセージ パッシング フレームワークとして機能しますか?

function MyConstructor() {
    this.MessageQueues = {};

    this.PostMessage = function (Subject) {
        var Queue = this.MessageQueues[Subject];
        if (Queue) return function() {
                                        var i = Queue.length - 1;
                                        do Queue[i]();
                                        while (i--);
                                    }
        }

    this.Listen = function (Subject, Listener) {
        var Queue = this.MessageQueues[Subject] || [];
        (this.MessageQueues[Subject] = Queue).push(Listener);
    }
}

次に、次のことができます。

var myInstance = new MyConstructor();
myInstance.Listen("some message", callback());
myInstance.Listen("some other message", anotherCallback());
myInstance.Listen("some message", yesAnotherCallback());

以降:

myInstance.PostMessage("some message");

キューをディスパッチします

于 2010-06-28T15:57:35.657 に答える