3

最近、独自の単純なイベント アグリゲーターを実装しようとしました。MSDN のイベント アグリゲーターの記事から多くのインスピレーションを得ました。MSDN のイベント アグリゲーターについて気付いたことが 1 つあります。それは、イベントが実際には独自のクラスであるということです。これはまったく悪いことではありません。ただし、小さなイベントごとに常に新しい空のクラスを作成するのは面倒です。

私が扱いにくいと思う理由は、個々の詳細なイベントごとにクラスを作成する必要があるためです。たとえば、マウス クリック イベントには、double_click、single_click、left_click、right_click などがあります。これらはすべて独自のクラスを持ちます。しばらくするとぐちゃぐちゃになります。

したがって、私自身の実装でClickEventは、 がクラスであるような方法で作成できると考えましたが、 Click イベントに関連するすべての詳細なイベントは の「タイプ」になりClickEventます。この場合、「タイプ」はenum. 使用法は次のようになります。

//Publisher
eventAggregator.GetEvent<ClickEvent>.Publish(ClickEventType.Double_Click, eventArgs);

//Subscriber
eventAggregator.GetEvent<ClickEvent>.Subscribe(ClickEventType.Double_Click, handlerMethod);

ただし、この実装が強く型付けされたイベントを持つという目的全体を無効にするかどうかはわかりませんか? 現在、ClickEventはさまざまなイベント列挙型の単なるコンテナーのようです。

4

2 に答える 2

3

はい、そうです (コンテナーのように見えます) - ハンドラーはクリックの種類に関係なく起動し、クリックの種類を判断するためにハンドラーにコードが必要になるため、少し面倒です。

あなたの問題が主にファイル/クラスの編成とコードの整理である場合、クリックイベントをメインのクリッククラス内のネストされたクラスとして作成しないでください。

例えば

public static class ClickEvents // Prevent instantiation
{
    public class SingleLeft { }
    public class SingleRight { }
    public class DoubleLeft { }
    public class DoubleRight { }
    // Are there any more click events possible?!
}

eventAggregator.GetEvent<ClickEvents.SingleLeft>.Publish();

それとは別に、イベント シグネチャを決定するのは型の一意性であるため、この特定の実装を満たすには複数の型が必要です。

少なくとも上記はハンドラーコードをきれいに保ちます

void HandleLeftClick()
{
}

void HandleClick(ClickArgs e) 
{
    if(e.ClickType == ClickType.Left)
    {
    }
}

編集:

また、複数のクリック タイプを処理する場合は、複数のイベントを同じハンドラーにサブスクライブできることも覚えておいてください。

eventAggregator.GetEvent<ClickEvents.SingleLeft>.Subscribe(HandlerMethod);
eventAggregator.GetEvent<ClickEvents.SingleRight>.Subscribe(HandlerMethod);

(これは、サブスクライバーがクリックされたマウス ボタンを気にしないというまれな状況で機能します)

于 2012-12-12T21:18:16.393 に答える
0

1つの可能性を逃したと思います。通知ごとに新しいクラスを作成する必要はありません。代わりに、クラスを自由に再利用できますが、任意の複雑さの追加状態を内部に保持できます。

public class MouseClickNotification {

    public bool IsDoubleClick;
    public MouseButton ClickedButton;

    // any additional stuff

このようにして、通知モデルの粒度を正確に定義するのはあなたです。

于 2012-12-12T21:17:19.013 に答える